5

背景が透明な画像を作成する必要がある場合、ここで問題が発生します。問題が fabricjs にあるのか php にあるのかはまだわかりません。色付きの背景を持つ画像を送信すると、すべて正常に動作します。背景が透明な画像を送信すると問題が発生します。生成された画像は、黒の背景で作成されます。ユーザーが保存ボタンをクリックすると、キャンバスの文字列表現がサーバー側のphpに送信され、キャンバスの画像が生成されます。したがって、次の関数を使用して、キャンバスの文字列表現を Ajax (jQuery の POST 関数) で送信しています。

    関数 sendStringRepresentation(){
        var strDataURI = canvas.toDataURL();
        strDataURI = strDataURI.substr(22, strDataURI.length);

        $.post("action/createImage.php",
        {
            str: strDataURI
        }、
        関数(データ){
            if(data == "OK"){
                $("#msg").html("画像が作成されました。");
        }
        そうしないと{
            $("#msg").html("画像が作成されていません。");
            }
        });
    }

PHP ファイルでは、次のコードを使用して画像を生成しています。

    // createImage.php

    $data = base64_decode($_POST["str"]);

    $urlUploadImages = "../uploads/img/";
    $nameImage = "test.png";

    $img = imagecreatefromstring($data);

    if($img) {
        imagepng($img, $urlUploadImages.$nameImage, 0);
        imagedestroy($img);

        // [データベース コード]

        エコー "OK";
    }
    そうしないと {
        echo 'エラー';
    }

繰り返しますが、問題は背景が透明なキャンバスだけです。色付きの背景を使用すると、すべて正常に機能します。

4

5 に答える 5

3

最後のステップはまったく逆です。

imagecopyresampled( $img, $alpha_image, 0, 0, 0, 0, $w, $h, $w, $h );

そして出来上がり!画像が透けます!

于 2012-11-07T21:53:07.010 に答える
1

これがまさにあなたが経験している問題であるかどうかはわかりませんが、GDライブラリのimagecreate*関数のいくつかはアルファチャネルなしで画像を作成します。

私が見つけた回避策は、を使用して画像を作成し、imagecreatetruecolorそれに透明な画像をコピーすることです。

次のようなプロセスを試してください。

$img = imagecreatefromstring($data);
$w = imagesx($img);
$h = imagesy($img);
$alpha_image = imagecreatetruecolor( $w, $h );
imagecopyresampled( $alpha_image, $img, 0, 0, 0, 0, $w, $h, $w, $h );

これにより、適切なアルファチャネルを備えた「トゥルーカラー」画像が得られるはずです。

于 2012-03-20T16:33:40.223 に答える
0

まったく同じ問題があり、この
imageAlphaBlending($img, true);を追加しました。
imageSaveAlpha($img, true);

Rodrigopandini のコードに追加すると、今では完璧に動作します。:)

 // createImage.php

$data = base64_decode($_POST["str"]);

$urlUploadImages = "../uploads/img/";
$nameImage = "test.png";

      $img = imagecreatefromstring($data);

      imageAlphaBlending($img, true);
      imageSaveAlpha($img, true);

if($img) {
    imagepng($img, $urlUploadImages.$nameImage, 0);
    imagedestroy($img);

    // [database code]

    echo "OK";
    }
     else {
          echo 'ERROR';
          }
于 2013-12-12T00:53:36.957 に答える