Java:在BuffereImage中拆分.GIF图像会生成格式不正确的图像
所以我有一段非常小的代码,它接受一个.gif图像作为输入,然后它将这个.gif图像分割成一个BuffereImage数组。之后,它将图像存储在磁盘上的阵列中。当我这样做时,输出图像包含在input.gif图像中看不到的严重白色像素噪声 输入gif的示例: 格式错误的输出图像示例(gif中的第三帧): 我用于拆分gif的代码如下所示:Java:在BuffereImage中拆分.GIF图像会生成格式不正确的图像,java,image,javax.imageio,Java,Image,Javax.imageio,所以我有一段非常小的代码,它接受一个.gif图像作为输入,然后它将这个.gif图像分割成一个BuffereImage数组。之后,它将图像存储在磁盘上的阵列中。当我这样做时,输出图像包含在input.gif图像中看不到的严重白色像素噪声 输入gif的示例: 格式错误的输出图像示例(gif中的第三帧): 我用于拆分gif的代码如下所示: public static void main(String[] args) throws Exception { splitGif(new F
public static void main(String[] args) throws Exception {
splitGif(new File("C:\\test.gif"));
}
public static void splitGif(File file) throws IOException {
ImageReader reader = ImageIO.getImageReadersBySuffix("gif").next(); reader.setInput(ImageIO.createImageInputStream(new FileInputStream(file)), false);
for(int i = 0; i < reader.getNumImages(true); i++) {
BufferedImage image = reader.read(i);
ImageIO.write(image, "PNG", new File(i + ".png"));
}
}
publicstaticvoidmain(字符串[]args)引发异常{
splitGif(新文件(“C:\\test.gif”);
}
公共静态void splitGif(文件)引发IOException{
ImageReader reader=ImageIO.getImageReadersBySuffix(“gif”).next();reader.setInput(ImageIO.createImageInputStream(新文件输入流(文件)),false);
for(int i=0;i
有人能帮我吗?所以问题是,当将.gif文件读入java时,给定帧中与前一帧相比没有改变颜色的所有像素都将是完全透明的。如果要读取.gif并将其拆分为正确渲染的BuffereImage数组,则必须使用前一帧的最后一个非透明像素填充当前帧的透明像素 代码:
publicstaticvoidsplitgif(文件)抛出IOException{
ImageReader=ImageIO.getImageReadersBySuffix(“gif”).next();
reader.setInput(ImageIO.createImageInputStream(新文件输入流(文件)),false);
BuffereImage lastImage=reader.read(0);
write(lastImage,“PNG”,新文件(0+“.PNG”);
for(inti=1;i
您自己解决了这个问题,但顺序很好:下一帧是所有先前帧的累积,填充当前帧中的透明像素
public static void splitGif(File file) throws IOException {
ImageReader reader = ImageIO.getImageReadersBySuffix("gif").next();
reader.setInput(ImageIO.createImageInputStream(new FileInputStream(file)), false);
BufferedImage outImage = null;
Graphics2D g = null;
for (int i = 0; i < reader.getNumImages(true); i++) {
BufferedImage image = reader.read(i);
if (g == null) {
BufferedImage outImage = new BufferedImage(image.getWidth(), image.getHeight(),
BufferedImage.TYPE_4BYTE_ABGR);
g = (Graphics2D) outImage.getGraphics();
}
g.drawImage(lastImage, 0, 0, null);
ImageIO.write(outImage, "PNG", new File(i + ".png"));
}
if (g != null) {
g.dispose();
}
}
publicstaticvoidsplitgif(文件)抛出IOException{
ImageReader=ImageIO.getImageReadersBySuffix(“gif”).next();
reader.setInput(ImageIO.createImageInputStream(新文件输入流(文件)),false);
BuffereImage outImage=null;
图形2d g=null;
for(int i=0;i
应该是一个getGraphics==createGraphics
,如文档所述dispose
public static void splitGif(File file) throws IOException {
ImageReader reader = ImageIO.getImageReadersBySuffix("gif").next();
reader.setInput(ImageIO.createImageInputStream(new FileInputStream(file)), false);
BufferedImage outImage = null;
Graphics2D g = null;
for (int i = 0; i < reader.getNumImages(true); i++) {
BufferedImage image = reader.read(i);
if (g == null) {
BufferedImage outImage = new BufferedImage(image.getWidth(), image.getHeight(),
BufferedImage.TYPE_4BYTE_ABGR);
g = (Graphics2D) outImage.getGraphics();
}
g.drawImage(lastImage, 0, 0, null);
ImageIO.write(outImage, "PNG", new File(i + ".png"));
}
if (g != null) {
g.dispose();
}
}