Почему этот GIF заканчивается как черный квадрат при изменении размера с Java ImageIO - PullRequest
4 голосов
/ 05 января 2011

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и / или Java Bug

Ответы [ 2 ]

2 голосов
/ 06 января 2011

Вот строковое представление ColorModel связанного изображения при загрузке через ImageIO:

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

Если я правильно понимаю, у вас есть один бит на пиксель, где 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);
0 голосов
/ 05 января 2011

Попробуйте это:

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

Это заставляет его работать. Конечно, вопрос в том, почему ..?

...