gpt4 book ai didi

java - 使用 imageinputstream 和 bufferedimage 从 gif 动画创建 png 条时丢失透明度

转载 作者:行者123 更新时间:2023-12-01 14:05:53 25 4
gpt4 key购买 nike

我终于能够编写以下代码,该代码采用动画 GIF 并将其转换为 png 条。然而由于某种原因它失去了原始 gif 的透明度。有人可以建议我如何保持透明度

public class Main {
public static void main(String[] args) throws IOException {
Object input = new File("C:\\Users\\drizzt\\Documents\\jax.gif");
// or Object input = new FileInputStream("animated.gif");
ImageInputStream stream = ImageIO.createImageInputStream(input);
Iterator readers = ImageIO.getImageReaders(stream);
if (!readers.hasNext())
throw new RuntimeException("no image reader found");
ImageReader reader = (ImageReader) readers.next();
reader.setInput(stream); // don't omit this line!
int n = reader.getNumImages(true); // don't use false!
int h = reader.getHeight(0);
int w = reader.getWidth(0);

BufferedImage img = new BufferedImage(w * n, h,
BufferedImage.TYPE_INT_RGB);
boolean[] imagedrawn;
imagedrawn = new boolean[n];

// big.drawImage(outputimage, w*i, 0, null);

System.out.println("numImages = " + n);

for (int i = 0; i < n; i++) {
BufferedImage image = reader.read(i);
System.out.println("image[" + i + "] = " + image);
// img = BufferedImage(w, h, BufferedImage.TYPE_INT_RGB);
// img.createGraphics()
imagedrawn[i] = img.createGraphics().drawImage(image, w * i, 0,
null);

}

try {
// retrieve image
// BufferedImage bi = getMyImage();
File outputfile = new File("c:\\saved.png");
ImageIO.write(img, "png", outputfile);
} catch (IOException e) {

}

stream.close();
}

}

最佳答案

替换这个:

BufferedImage img = new BufferedImage(w * n, h, BufferedImage.TYPE_INT_RGB);

BufferedImage img = new BufferedImage(w * n, h, BufferedImage.TYPE_INT_ARGB);

...您将获得透明度。

可能更好的是:

BufferedImage img = reader.getRawImageType(0).createBufferedImage(w * n, h);

然后,您将保留 GIF 中的确切图像布局,并可能获得较小的输出图像(这里的一个小细节是,如果 Java 中没有相应的颜色空间, getRawImageType 可能会返回 null ,但是这个对于 GIF 来说可能永远不会发生)。

与该问题无关,但仍然是很好的做法:无论何时 img.createGraphics()您还应该调用dispose()关于Graphics2D画完后。移动createGraphics()循环外和 dispose在循环之后以获得更好的性能。

甚至可以完全避免绘制,直接将每一帧的内容读入 img ,用这样的东西替换你的循环:

ImageReadParam param = reader.getDefaultReadParam();
param.setDestination(img);

for (int i = 0; i++; i < n) {
param.setDestinationOffset(new Point(w * i, 0);
reader.read(i, param);
}

关于java - 使用 imageinputstream 和 bufferedimage 从 gif 动画创建 png 条时丢失透明度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18908217/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com