4

Java ImageIO は、この白黒画像http://www.jthink.net/jaikoz/scratch/black.gifを正しく表示しますが、このコードを使用してサイズを変更しようとすると

public static BufferedImage resize2D(Image srcImage, int size)
{
    int w = srcImage.getWidth(null);
    int h = srcImage.getHeight(null);

    // Determine the scaling required to get desired result.
    float scaleW = (float) size / (float) w;
    float scaleH = (float) size / (float) h;

    MainWindow.logger.finest("Image Resizing to size:" + size + " w:" + w + ":h:" + h + ":scaleW:" + scaleW + ":scaleH" + scaleH);

    //Create an image buffer in which to paint on, create as an opaque Rgb type image, it doesn't matter what type
    //the original image is we want to convert to the best type for displaying on screen regardless
    BufferedImage bi = new BufferedImage(size, size, BufferedImage.TYPE_INT_RGB);

    // Set the scale.
    AffineTransform tx = new AffineTransform();
    tx.scale(scaleW, scaleH);

    // Paint image.
    Graphics2D g2d = bi.createGraphics();
                    g2d.setComposite(AlphaComposite.Src);
    g2d.drawImage(srcImage, tx, null);
    g2d.dispose();
    return bi;
}

真っ黒なイメージになってしまいます。画像を小さくしようとしていますが(サムネイル)、テスト目的でサイズを大きくしても、黒い四角になってしまいます。

他の画像のサイズ変更は問題ありません。gif/and または Java バグの問題は誰でも知っています。

4

2 に答える 2

2

ColorModelを介してロードされた場合のリンクされたイメージの文字列表現は次のImageIOとおりです。

IndexColorModel: #pixelBits = 1 numComponents = 4 color space = java.awt.color.ICC_ColorSpace@1572e449 transparency = 2 transIndex   = 1 has alpha = true isAlphaPre = false

私がこれを正しく理解していれば、ピクセルごとに 1 ビットがあり、0ビットは不透明な黒で、1ビットは透明です。BufferedImage最初はすべて黒なので、黒と透明のピクセルを混ぜて描画しても効果はありません。

これを使用していてもAlphaComposite.Src、透過パレット エントリの R/G/B 値がゼロとして読み取られるため、役に立ちません (これが GIF でエンコードされているのか、JDK のデフォルトだけなのかはわかりません)。

次の方法で回避できます。

  1. BufferedImageを全白ピクセルで初期化する
  2. 使用するAlphaComposite.SrcOver

resize2Dしたがって、実装の最後の部分は次のようになります。

// Paint image.
Graphics2D g2d = bi.createGraphics();
g2d.setColor(Color.WHITE);
g2d.fillRect(0, 0, size, size);
g2d.setComposite(AlphaComposite.SrcOver);
g2d.drawImage(srcImage, tx, null);
于 2011-01-05T22:33:10.897 に答える
0

これを試して:

BufferedImage bi = new BufferedImage(size, size, BufferedImage.TYPE_INT_ARGB);

それはそれを機能させます。もちろん、問題はなぜ..?

于 2011-01-05T18:32:10.867 に答える