1

ユーザーが製品画像の一部の色を変更できるようにする PHP サーバー スクリプトを実装しようとしています。たとえば、木製の椅子に赤い布の座面があり、布の色だけを変更したいとします。

以前に Flash でシステムを実装していました。製品画像は JPG であり、色編集可能な領域は、透過性を持つ個別の PNG として保存されたマスクによって定義されます。マスクのアルファ値を使用して元の画像のコピーが作成され、元の画像の上の新しいレイヤーに配置されます。つまり、カラー編集可能な領域が新しいレイヤーにコピーされます。ユーザーは、この新しいレイヤーをカラー編集できます。

PNG マスクは既にあるので、PHP で同じ機能を実現して、より多くのエンドユーザーがアクセスできるようにしようとしています。PHP GD Use one image to mask another image, including transparentからスクリプトを変更してみましたが、次のようになりました。

<?php
// Load source and mask
$source = imagecreatefromjpeg( 'source' );
$mask = imagecreatefrompng( 'destination' );
// Apply mask to source
imagealphamask( $source, $mask );
// Output
header( "Content-type: image/png");
imagepng( $source );

function imagealphamask( &$picture, $mask ) {
    // Get sizes and set up new picture
    $xSize = imagesx( $picture );
    $ySize = imagesy( $picture );
    $newPicture = imagecreatetruecolor( $xSize, $ySize );
    imagesavealpha( $newPicture, true );
    imagefill( $newPicture, 0, 0, imagecolorallocatealpha( $newPicture, 0, 0, 0, 127 ) );

    // Resize mask if necessary
    //if( $xSize != imagesx( $mask ) || $ySize != imagesy( $mask ) ) {
       // $tempPic = imagecreatetruecolor( $xSize, $ySize );
       // imagecopyresampled( $tempPic, $mask, 0, 0, 0, 0, $xSize, $ySize, imagesx( $mask ), imagesy( $mask ) );
       // imagedestroy( $mask );
       // $mask = $tempPic;
    //}

    // Perform pixel-based alpha map application
    for( $x = 0; $x < $xSize; $x++ ) {
        for( $y = 0; $y < $ySize; $y++ ) {
            $alpha = imagecolorsforindex( $mask, imagecolorat( $mask, $x, $y ) );
            $alpha = $alpha['alpha'];
            $color = imagecolorsforindex( $picture, imagecolorat( $picture, $x, $y ) );
            //preserve alpha by comparing the two values
            //if ($color['alpha'] > $alpha)
               //$alpha = $color['alpha'];
            //kill data for fully transparent pixels
            if ($alpha == 127) {
                $color['red'] = 0;
                $color['blue'] = 0;
                $color['green'] = 0;
            }
        imagesetpixel( $newPicture, $x, $y, imagecolorallocatealpha( $newPicture, $color[ 'red' ], $color[ 'green' ], $color[ 'blue' ], $alpha ) );
        }
    }

    //TODO: colorize the new layer in some way here, e.g. imagefilter($newPicture, IMG_FILTER_COLORIZE, 150, 90, 0);

    //place the new layer above the original image
   imagecopymerge($picture,$newPicture,0,0,0,0,$xSize,$ySize,100);

}

?>

私は PHP について何も知りませんが、上記のスクリプトは、私たちが望むことを行うべきだと思われます。代わりに、正しい領域を切り取りますが、黒で囲みます。

ソース画像がPNGではなくJPGであることに関連していない限り、問題が何であるかは本当にわかりません。トゥルーカラーに変換してみましたが、出力には影響しませんでした。

また...このコードは遅すぎます。イメージの生成には 5 秒以上かかります。まったく別のアプローチを採用したり、別のフレームワークを使用したりする必要がありますか? 私は Web 開発について何も知りませんが、この仕事を割り当てられ、それを完了する必要があります。

4

0 に答える 0