2

だから私は3つの画像を透明にし、それらを互いに重ねています。この投稿のサンプル コードに従いました: php で画像の背景を削除して透明な png を保存しますが、抽出された画像はすべて、完全に均一な単色の背景を持たないため、周囲に醜い白い境界線があります。それらは白く見えるかもしれませんが、実際には通常、さまざまな色合いのグレーや青が含まれています.

だから今、私は画像のこれらの醜い白い境界線を取り除きたい. 問題を解決する Java 関数をオンラインで見つけました: http://www.logikdev.com/2011/10/05/make-image-backgrounds-transparent-with-tolerance/彼が使用するコードは次のとおりです。

private Image makeColorTransparent(final BufferedImage im, final Color color, int tolerance) {
int temp = 0;
if (tolerance < 0 || tolerance > 100) {
    System.err.println("The tolerance is a percentage, so the value has to be between 0 and 100.");
    temp = 0;
} else {
    temp = tolerance * (0xFF000000 | 0xFF000000) / 100;
}
final int toleranceRGB = Math.abs(temp);

final ImageFilter filter = new RGBImageFilter() {
    // The color we are looking for (white)... Alpha bits are set to opaque
    public int markerRGBFrom = (color.getRGB() | 0xFF000000) - toleranceRGB;
    public int markerRGBTo = (color.getRGB() | 0xFF000000) + toleranceRGB;

    public final int filterRGB(final int x, final int y, final int rgb) {
        if ((rgb | 0xFF000000) >= markerRGBFrom && (rgb | 0xFF000000) <= markerRGBTo) {
            // Mark the alpha bits as zero - transparent
            return 0x00FFFFFF & rgb;
        } else {
            // Nothing to do
            return rgb;
        }
    }
};

final ImageProducer ip = new FilteredImageSource(im.getSource(), filter);
return Toolkit.getDefaultToolkit().createImage(ip);

}

しかし、phpでこれを行う方法がわかりません。誰でも私を助けることができますか?

4

2 に答える 2

2

IMagick::paintTransparentImageを使用できます

このメソッドのシグネチャは次のとおりです。

 bool Imagick::paintTransparentImage ( mixed $target , float $alpha , float $fuzz );

これの使用例は次のとおりです。

$im = new Imagick("test.jpg");
$im->paintTransparentImage(($im->getImagePixelColor(0, 0), 0, 1200));
$im->setImageFormat("png");
$im->writeImage("test.png");

探している結果を得るには、$fuzz パラメーターをいじる必要があります。

于 2013-06-19T13:44:00.067 に答える