2015-08-03 2 views
-1

Я пытаюсь подписать подписи, и я пытаюсь сделать подпись к изображению.Недопустимый аргумент для forreach()

Everytime Я нажимаю отправить я получаю удар с этой ошибкой

Warning: Invalid argument supplied for foreach() in C:\xampp\htdocs\CareMed\signature-to-image.php on line 58 

Вот файл подписи к image.php

 <?php 
    /** 
    * Signature to Image: A supplemental script for Signature Pad that 
     * generates an image of the signature’s JSON output server-side using PHP. 
     * 
     * @project ca.thomasjbradley.applications.signaturetoimage 
     * @author Thomas J Bradley <[email protected]> 
* @link http://thomasjbradley.ca/lab/signature-to-image 
* @link http://github.com/thomasjbradley/signature-to-image 
* @copyright Copyright MMXI–, Thomas J Bradley 
* @ 

    license New BSD License 
    * @version 1.1.0 
    */ 

/** 
* Accepts a signature created by signature pad in Json format 
* Converts it to an image resource 
* The image resource can then be changed into png, jpg whatever PHP GD supports 
* 
* To create a nicely anti-aliased graphic the signature is drawn 12 times it's original size then shrunken 
* 
* @param string|array $json 
* @param array $options OPTIONAL; the options for image creation 
* imageSize => array(width, height) 
* bgColour => array(red, green, blue) | transparent 
* penWidth => int 
* penColour => array(red, green, blue) 
* drawMultiplier => int 
* 
* @return object 
*/ 
function sigJsonToImage ($json, $options = array()) { 
    $defaultOptions = array(
    'imageSize' => array(198, 55) 
    ,'bgColour' => array(0xff, 0xff, 0xff) 
    ,'penWidth' => 2 
    ,'penColour' => array(0x14, 0x53, 0x94) 
    ,'drawMultiplier'=> 12 
); 

    $options = array_merge($defaultOptions, $options); 

    $img = imagecreatetruecolor($options['imageSize'][0] * $options['drawMultiplier'], $options['imageSize'][1] * $options['drawMultiplier']); 

    if ($options['bgColour'] == 'transparent') { 
    imagesavealpha($img, true); 
    $bg = imagecolorallocatealpha($img, 0, 0, 0, 127); 
    } else { 
    $bg = imagecolorallocate($img, $options['bgColour'][0], $options['bgColour'][1], $options['bgColour'][2]); 
    } 

    $pen = imagecolorallocate($img, $options['penColour'][0], $options['penColour'][1], $options['penColour'][2]); 
    imagefill($img, 0, 0, $bg); 

    if (is_string($json)) 
    $json = json_decode(stripslashes($json)); 

    foreach ($json as $v) 
    drawThickLine($img, $v->lx * $options['drawMultiplier'], $v->ly * $options['drawMultiplier'], $v->mx * $options['drawMultiplier'], $v->my * $options['drawMultiplier'], $pen, $options['penWidth'] * ($options['drawMultiplier']/2)); 

    $imgDest = imagecreatetruecolor($options['imageSize'][0], $options['imageSize'][1]); 

    if ($options['bgColour'] == 'transparent') { 
    imagealphablending($imgDest, false); 
    imagesavealpha($imgDest, true); 
    } 

    imagecopyresampled($imgDest, $img, 0, 0, 0, 0, $options['imageSize'][0], $options['imageSize'][0], $options['imageSize'][0] * $options['drawMultiplier'], $options['imageSize'][0] * $options['drawMultiplier']); 
    imagedestroy($img); 

    return $imgDest; 
} 

/** 
* Draws a thick line 
* Changing the thickness of a line using imagesetthickness doesn't produce as nice of result 
* 
* @param object $img 
* @param int $startX 
* @param int $startY 
* @param int $endX 
* @param int $endY 
* @param object $colour 
* @param int $thickness 
* 
* @return void 
*/ 
function drawThickLine ($img, $startX, $startY, $endX, $endY, $colour, $thickness) { 
    $angle = (atan2(($startY - $endY), ($endX - $startX))); 

    $dist_x = $thickness * (sin($angle)); 
    $dist_y = $thickness * (cos($angle)); 

    $p1x = ceil(($startX + $dist_x)); 
    $p1y = ceil(($startY + $dist_y)); 
    $p2x = ceil(($endX + $dist_x)); 
    $p2y = ceil(($endY + $dist_y)); 
    $p3x = ceil(($endX - $dist_x)); 
    $p3y = ceil(($endY - $dist_y)); 
    $p4x = ceil(($startX - $dist_x)); 
    $p4y = ceil(($startY - $dist_y)); 

    $array = array(0=>$p1x, $p1y, $p2x, $p2y, $p3x, $p3y, $p4x, $p4y); 
    imagefilledpolygon($img, $array, (count($array)/2), $colour); 
} 

И это линия 58 в этом файле .. не знаю, где эта проблема лежит

foreach ($json as $v) 
        drawThickLine($img, $v->lx * $options['drawMultiplier'], $v->ly * $options['drawMultiplier'], $v->mx * $options['drawMultiplier'], $v->my * $options['drawMultiplier'], $pen, $options['penWidth'] * ($options['drawMultiplier']/2)); 

        $imgDest = imagecreatetruecolor($options['imageSize'][0], $options['imageSize'][1]); 

        if ($options['bgColour'] == 'transparent') { 
        imagealphablending($imgDest, false); 
        imagesavealpha($imgDest, true); 
        } 

        imagecopyresampled($imgDest, $img, 0, 0, 0, 0, $options['imageSize'][0], $options['imageSize'][0], $options['imageSize'][0] * $options['drawMultiplier'], $options['imageSize'][0] * $options['drawMultiplier']); 
        imagedestroy($img); 

        return $imgDest; 
       } 

ЭОД **********

Вот файл php, передающий вывод в img.

<?php 
session_start(); 
require_once 'signature-to-image.php'; 
$json = $_POST['output']; 
$img = sigJsonToImage($json); 
imagepng($img, 'signature.png'); 

?> 

Вот основной HTML-файл, содержащий холст и подпись колодки

<html><head> 
    <meta charset="utf-8"> 
    <title>Full-Window · Signature Pad</title> 
    <style> 
    * { 
     -webkit-user-select: none; 
     -moz-user-select: none; 
     user-select: none; 
    } 
    html, body { 
     min-height: 100%; 
     height: 100%; 
     max-width: 100%; 
     width: 100%; 
     overflow: hidden; 
    } 
    html, body, form { 
     margin: 0px; 
    } 
    html, form { 
     padding: 0px; 
    } 
    html, body, fieldset { 
     background: #aaa; 
    } 
    fieldset { 
     position: absolute; 
     border: 5px solid #aaa; 
     background: #aaa; 
     right: 0px; 
     bottom: 0px; 
    } 
    canvas { 
     outline: 5px solid #aaa; 
     background: #fff; 
    } 
    input[type=submit], input[type=reset] { 
     font-size: larger; 
    } 
    </style> 
    <link rel="stylesheet" href="assets/jquery.signaturepad.css"> 
    <!--[if lt IE 9]><script src="../assets/flashcanvas.js"></script><![endif]--> 
    <script src="http://ajax.googleapis.com/ajax/libs/jquery/1.5.1/jquery.min.js"></script> 
</head> 
<body> 
    <form method="post" action="finaladd.php" class="sigPad"> 

    <div class="sig sigWrapper"> 
    <div class="typed"></div> 
    <canvas class="pad" width="198" height="55"></canvas> 
    <input type="hidden" name="output" class="output"> 
    <fieldset> 
      <input type="reset" value="clear" /> 
      <input type='submit' value='submit'/> 
     </fieldset> 
    </div> 
    <button type="submit">I accept the terms of this agreement.</button> 
</form> 



    <script src="assets/numeric-1.2.6.min.js"></script> 
    <script src="assets/bezier.js"></script> 
    <script src="jquery.signaturepad.js"></script> 
    <script> 
    (function(window) { 
    var $canvas, 
     onResize = function(event) { 
      $canvas.attr({ 
      height: window.innerHeight, 
      width: window.innerWidth 
      }); 
     }; 

    $(document).ready(function() { 
     $canvas = $('canvas'); 
     window.addEventListener('orientationchange', onResize, false); 
     window.addEventListener('resize', onResize, false); 
     onResize(); 

     $('form').signaturePad({ 
     drawBezierCurves: true, 
     variableStrokeWidth:true, 
     drawOnly: true, 
     defaultAction: 'drawIt', 
     validateFields: false, 
     lineWidth: 0, 
     output: null, 
     sigNav: null, 
     name: null, 
     typed: null, 
     clear: 'input[type=reset]', 
     typeIt: null, 
     drawIt: null, 
     typeItDesc: null, 
     drawItDesc: null 
     }); 
    }); 
    }(this)); 
    </script> 
    <script src="assets/json2.min.js"></script> 

</body></html> 
+0

Является ли строка '$ json' переданной функции действительной json? –

+0

Вот PHP для смены изображения – Kevin1990M

+0

ответ

-1

Возможно, переменная $ JSON является недействительным.

if (is_string($json)) { 
    $json = json_decode(stripslashes($json)); 
} 

if (!is_object($json)) { 
    $json = new stdClass(); 
} 
Смежные вопросы