3

このコードを使用して、サイズ変更された画像をシャープにしようとしています:

imageconvolution($imageResource, array(
        array( -1, -1, -1 ),
        array( -1, 16, -1 ),
        array( -1, -1, -1 ),
    ), 8, 0);

上記のコードを使用して透明な PNG 画像をシャープにすると、左上隅に黒い点が表示されます (さまざまな畳み込みカーネルを試しましたが、結果は同じです)。サイズを変更した後、画像は問題ないように見えました。

1枚目の画像がオリジナルです

2枚目の画像は加工したものです

元の画像 画像をシャープにする

編集:何が間違っているのですか?ピクセルから取得した色を使用しています。

$color = imagecolorat($imageResource, 0, 0);
    imageconvolution($imageResource, array(
        array( -1, -1, -1 ),
        array( -1, 16, -1 ),
        array( -1, -1, -1 ),
    ), 8, 0);
            imagesetpixel($imageResource, 0, 0, $color);

imagecolorat正しい機能ですか?それとも位置は合っていますか?

EDIT2 : 座標を変更しましたが、まだ運がありません。imagecolorat(この投稿によると)によって与えられた透明性を確認しました。これはダンプです:

array(4) {
   red => 0
   green => 0
   blue => 0
   alpha => 127
}

アルファ 127 = 100% 透明。これらのゼロは問題を引き起こす可能性があります...

4

1 に答える 1

3

畳み込みコードのバグのようです (コーナーは一部の実装では特殊なケースです)。

回避策として、畳み込みの直前にそのコーナーのピクセル値を保存し、後で復元することができますimageSetPixel()

保存する必要があるピクセルは (0,0) にあり、おそらく透明度も確認する必要があります (ただし、 と だけで動作するはずimageColorAtですimageSetPixel)。

テストコード

ファイル「giants.png」は、あなたが上に投稿したものから取得しました。使用しないimageSetPixelと、あなたが得たのと同じ余分なピクセルが発生します。ではimageSetPixel、画像は私には正しく見えます。

ImageSaveAlphaおそらく、アルファブレンディングを実行または設定するシーケンスに若干の違いがあります。

<?php
        $giants = ImageCreateFromPNG('giants.png');

        $imageResource = ImageCreateTrueColor(190, 190);

        ImageColorTransparent($imageResource, ImageColorAllocateAlpha($imageResource, 0, 0, 0, 127));
        ImageAlphaBlending($imageResource, False);
        ImageSaveAlpha($imageResource, True);

        ImageCopyResampled($imageResource, $giants, 0, 0, 0, 0, 190, 190, ImageSX($giants), ImageSY($giants));

        $color = ImageColorAt($imageResource, 0, 0);
        ImageConvolution($imageResource, array(
                        array( -1, -1, -1 ),
                        array( -1, 16, -1 ),
                        array( -1, -1, -1 ),
                ), 8, 0);
        ImageSetPixel($imageResource, 0, 0, $color);
        ImagePNG($imageResource, 'dwarves.png');
?>
于 2012-10-16T15:28:20.787 に答える