已知图像的数据部分,为一数组,java中如何实现该数组的256色位图保存呢? 已知图像的数据部分,为一数组,现在想把这个数据保存为256色位图,请问该怎么样实现!我在网上搜索了一下,就是一篇文章大家翻来覆去的抄,还是24位的位图保存,而且是将一副图片保存,和我的初衷不一样。请大侠们指点,谢谢! 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 int width = 300; int height = 200; int numBands = 3; // 存放图像数据的数组 byte[] byteArray = new byte[width * height * numBands]; int j = 0; for (int i = 0; i < width * height * numBands; i++) { if (j == 0) { byteArray[i] = (byte) 255; j++; } else if (j == 1) { byteArray[i] = (byte) 0; j++; } else if (j == 2) { byteArray[i] = (byte) 0; j = 0; } } DataBuffer dataBuffer = new DataBufferByte(byteArray, numBands); int[] bandOffsets = new int[] { 0, 1, 2}; SampleModel sampleModel = new PixelInterleavedSampleModel( DataBuffer.TYPE_BYTE, width, height, 3, width * 3, bandOffsets); WritableRaster wr = Raster.createWritableRaster( sampleModel, dataBuffer, new Point(0, 0)); // ColorModel ColorSpace cs = ColorSpace.getInstance(ColorSpace.CS_sRGB); ComponentColorModel cm = new ComponentColorModel( cs, false, false, Transparency.OPAQUE, DataBuffer.TYPE_BYTE); BufferedImage bufferedImage = new BufferedImage(cm, wr, false, null); try{ ImageIO.write(bufferedImage,"bmp",new File("test.bmp")); }catch(Exception ex){ ex.printStackTrace(); } to:chenweionline(键盘上的舞者) 这个不是256色的吧,256色的好像数据部分是在调色板中的索引值啊! 是否在编码成bmp格式时,编码库会创建调色板和索引?这个我不太了解,你可以具体研究一下,如果有什么认识还请继续跟帖告知。 看了网上的那篇24位位图保存的文章,觉得楼主可以借鉴一下。24位位图是没有调色板的,其数据部分就是rgb值,而256色的数据部分的值是在调色板中的索引值,这点楼主已知道就不用说了,将那篇文章写数据部分给修改一下,就成!先写位图文件头,第二步写信息头,第三步,写调色板:这一步具体如下:byte []rgb = new byte[4];//看调色板的定义,4个字节for(int i=0; i<256; i++){rgb[0]=(byte)i;//blue rgb[1]=(byte)i;//green rgb[2]=(byte)i;//red rgb[3]=0;//reserved,be 0 fo.write(rgb);}第四步:写数据部分,数据部分的值应在0到255之间,因为其为索引值嘛。楼主既然说数据部分已知,想来是没问题的了。大概就是这样,有问题请大家指出了。呵呵! 知道了对象的名字,能否得到这个对象的实例? 直接看最下面的问题 新人提一个小问题 有回答10分钟结贴 高分求救,JTable刷新问题,前辈们请进,在线等 困惑我很久的问题:什么时候使用异常? 希望各位高手解惑!!谢谢!~~~ 想要孙鑫java/VC++完整视频教程的找我 如何删除System.out.println(" 内容不限 ")? 在调试中出现 "row index out of change"?怎么解决?求助! 请教Socket编程 请教关于在JBuilder4下的问题 大家帮我改下这程序 Java中有没类似JavaScript中的eval()函数?
int height = 200;
int numBands = 3;
// 存放图像数据的数组
byte[] byteArray = new byte[width * height * numBands];
int j = 0;
for (int i = 0; i < width * height * numBands; i++) {
if (j == 0) {
byteArray[i] = (byte) 255;
j++;
}
else if (j == 1) {
byteArray[i] = (byte) 0;
j++;
}
else if (j == 2) {
byteArray[i] = (byte) 0;
j = 0;
}
} DataBuffer dataBuffer = new DataBufferByte(byteArray, numBands);
int[] bandOffsets = new int[] {
0, 1, 2};
SampleModel sampleModel = new PixelInterleavedSampleModel(
DataBuffer.TYPE_BYTE, width, height, 3, width * 3, bandOffsets); WritableRaster wr = Raster.createWritableRaster(
sampleModel, dataBuffer, new Point(0, 0)); // ColorModel
ColorSpace cs = ColorSpace.getInstance(ColorSpace.CS_sRGB);
ComponentColorModel cm = new ComponentColorModel(
cs, false, false, Transparency.OPAQUE, DataBuffer.TYPE_BYTE); BufferedImage bufferedImage = new BufferedImage(cm, wr, false, null);
try{
ImageIO.write(bufferedImage,"bmp",new File("test.bmp"));
}catch(Exception ex){
ex.printStackTrace();
}
这个不是256色的吧,256色的好像数据部分是在调色板中的索引值啊!
这个我不太了解,你可以具体研究一下,如果有什么认识还请继续跟帖告知。
24位位图是没有调色板的,其数据部分就是rgb值,而256色的数据部分的值是在调色板中的索引值,这点楼主已知道就不用说了,将那篇文章写数据部分给修改一下,就成!先写位图文件头,第二步写信息头,第三步,写调色板:这一步具体如下:
byte []rgb = new byte[4];//看调色板的定义,4个字节
for(int i=0; i<256; i++)
{rgb[0]=(byte)i;//blue
rgb[1]=(byte)i;//green
rgb[2]=(byte)i;//red
rgb[3]=0;//reserved,be 0
fo.write(rgb);
}
第四步:写数据部分,数据部分的值应在0到255之间,因为其为索引值嘛。楼主既然说数据部分已知,想来是没问题的了。
大概就是这样,有问题请大家指出了。呵呵!