将带有自定义调色板的Java Image对象保存为GIF文件的最佳方法



我正试图编写一些Java代码,从源文件中获取图像,并使用我生成的自定义调色板将其保存为GIF文件。到目前为止,我发现最简单的方法是使用MemoryImageSource类,但我不确定在设置数据后将其保存到文件中的最佳方法。一些样本来源可能会澄清我试图做的事情:

BufferedImage image = ImageIO.read(new File(sourceImageFilename));
IndexColorModel palette = getCustomGeneratedPalette();
byte[] imageIndiciesIntoPalette = getPixelIndiciesIntoPalette(image, palette);
MemoryImageSource finalImage = new MemoryImageSource(image.getWidth(), 
    image.getHeight(),palette, imageIndiciesIntoPalette, 0, image.getWidth());
// cast exception on next line
ImageIO.write((RenderedImage) finalImage, "gif", new File(targetImageFileName));

我所想做的就是使用我创建的自定义调色板将图像保存到gif中——任何不使用第三方库的建议都将不胜感激。

我找到了一个解决方案,主要借鉴自:

(不要打开此网站,它现在不安全/已感染。) www.exampledepot.com/egs/java.awt.images/Mandelbrot2.html

它不使用MemoryImageSource,而是使用自定义调色板和从SampleModel创建的光栅。

java.awt.image.DataBuffer dataBuffer = new java.awt.image.DataBufferByte(
    imageIndiciesIntoPalette, imageIndiciesIntoPalette.length);
SampleModel sampleModel = new java.awt.image.SinglePixelPackedSampleModel(
    DataBuffer.TYPE_BYTE, sourceImage.getWidth(), sourceImage.getHeight(), 
    new int[]{0xff});
// Create a raster using the sample model and data buffer
WritableRaster raster = Raster.createWritableRaster(sampleModel, dataBuffer, null);
// Combine the color model and raster into a buffered image
BufferedImage finalImage = new BufferedImage(palette, raster, false, null);
ImageIO.write(finalImage, "gif", new File(targetImageFileName));

最新更新