用Java处理bmp图片,把bmp图片变成位图,并保存下来。快疯了。。。。。。。 用Java处理bmp图片,把bmp图片变成位图,并保存下来。快疯了。(最好有代码)希望各位大大帮帮忙。谢谢 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 public Image loadbitmap (String sdir, String sfile) { Image image; System.out.println("loading:"+sdir+sfile); try { FileInputStream fs=new FileInputStream(sdir+sfile); int bflen=14; // 14 byte BITMAPFILEHEADER byte bf[]=new byte[bflen]; fs.read(bf,0,bflen); int bilen=40; // 40-byte BITMAPINFOHEADER byte bi[]=new byte[bilen]; fs.read(bi,0,bilen); // Interperet data. int nsize = (((int)bf[5]&0xff)<<24) | (((int)bf[4]&0xff)<<16) | (((int)bf[3]&0xff)<<8) | (int)bf[2]&0xff; System.out.println("File type is :"+(char)bf[0]+(char)bf[1]); System.out.println("Size of file is :"+nsize); int nbisize = (((int)bi[3]&0xff)<<24) | (((int)bi[2]&0xff)<<16) | (((int)bi[1]&0xff)<<8) | (int)bi[0]&0xff; System.out.println("Size of bitmapinfoheader is :"+nbisize); int nwidth = (((int)bi[7]&0xff)<<24) | (((int)bi[6]&0xff)<<16) | (((int)bi[5]&0xff)<<8) | (int)bi[4]&0xff; System.out.println("Width is :"+nwidth); int nheight = (((int)bi[11]&0xff)<<24) | (((int)bi[10]&0xff)<<16) | (((int)bi[9]&0xff)<<8) | (int)bi[8]&0xff; System.out.println("Height is :"+nheight); int nplanes = (((int)bi[13]&0xff)<<8) | (int)bi[12]&0xff; System.out.println("Planes is :"+nplanes); int nbitcount = (((int)bi[15]&0xff)<<8) | (int)bi[14]&0xff; System.out.println("BitCount is :"+nbitcount); // Look for non-zero values to indicate compression int ncompression = (((int)bi[19])<<24) | (((int)bi[18])<<16) | (((int)bi[17])<<8) | (int)bi[16]; System.out.println("Compression is :"+ncompression); int nsizeimage = (((int)bi[23]&0xff)<<24) | (((int)bi[22]&0xff)<<16) | (((int)bi[21]&0xff)<<8) | (int)bi[20]&0xff; System.out.println("SizeImage is :"+nsizeimage); int nxpm = (((int)bi[27]&0xff)<<24) | (((int)bi[26]&0xff)<<16) | (((int)bi[25]&0xff)<<8) | (int)bi[24]&0xff; System.out.println("X-Pixels per meter is :"+nxpm); int nypm = (((int)bi[31]&0xff)<<24) | (((int)bi[30]&0xff)<<16) | (((int)bi[29]&0xff)<<8) | (int)bi[28]&0xff; System.out.println("Y-Pixels per meter is :"+nypm); int nclrused = (((int)bi[35]&0xff)<<24) | (((int)bi[34]&0xff)<<16) | (((int)bi[33]&0xff)<<8) | (int)bi[32]&0xff; System.out.println("Colors used are :"+nclrused); int nclrimp = (((int)bi[39]&0xff)<<24) | (((int)bi[38]&0xff)<<16) | (((int)bi[37]&0xff)<<8) | (int)bi[36]&0xff; System.out.println("Colors important are :"+nclrimp); if (nbitcount==24) { // No Palatte data for 24-bit format but scan lines are // padded out to even 4-byte boundaries. int npad = (nsizeimage / nheight) - nwidth * 3; int ndata[] = new int [nheight * nwidth]; byte brgb[] = new byte [( nwidth + npad) * 3 * nheight]; fs.read (brgb, 0, (nwidth + npad) * 3 * nheight); int nindex = 0; for (int j = 0; j < nheight; j++) { for (int i = 0; i < nwidth; i++) { ndata [nwidth * (nheight - j - 1) + i] = (255&0xff)<<24 | (((int)brgb[nindex+2]&0xff)<<16) | (((int)brgb[nindex+1]&0xff)<<8) | (int)brgb[nindex]&0xff; // System.out.println("Encoded Color at (" +i+","+j+")is:"+nrgb+" (R,G,B)= (" +((int)(brgb[2]) & 0xff)+"," +((int)brgb[1]&0xff)+"," +((int)brgb[0]&0xff)+")"); nindex += 3; } nindex += npad; } image = createImage ( new MemoryImageSource (nwidth, nheight, ndata, 0, nwidth)); } else if (nbitcount == 8) { // Have to determine the number of colors, the clrsused // parameter is dominant if it is greater than zero. If // zero, calculate colors based on bitsperpixel. int nNumColors = 0; if (nclrused > 0) { nNumColors = nclrused; } else { nNumColors = (1&0xff)<<nbitcount; } System.out.println("The number of Colors is"+nNumColors); // Some bitmaps do not have the sizeimage field calculated // Ferret out these cases and fix 'em. if (nsizeimage == 0) { nsizeimage = ((((nwidth*nbitcount)+31) & 31 ) >> 3); nsizeimage *= nheight; System.out.println("nsizeimage (backup) is"+nsizeimage); } // Read the palatte colors. int npalette[] = new int [nNumColors]; byte bpalette[] = new byte [nNumColors*4]; fs.read (bpalette, 0, nNumColors*4); int nindex8 = 0; for (int n = 0; n < nNumColors; n++) { npalette[n] = (255&0xff)<<24 | (((int)bpalette[nindex8+2]&0xff)<<16) | (((int)bpalette[nindex8+1]&0xff)<<8) | (int)bpalette[nindex8]&0xff; // System.out.println ("Palette Color "+n +" is:"+npalette[n]+" (res,R,G,B)= (" +((int)(bpalette[nindex8+3]) & 0xff)+"," +((int)(bpalette[nindex8+2]) & 0xff)+"," +((int)bpalette[nindex8+1]&0xff)+"," +((int)bpalette[nindex8]&0xff)+")"); nindex8 += 4; } // Read the image data (actually indices into the palette) // Scan lines are still padded out to even 4-byte // boundaries. int npad8 = (nsizeimage / nheight) - nwidth; System.out.println("nPad is:"+npad8); int ndata8[] = new int [nwidth*nheight]; byte bdata[] = new byte [(nwidth+npad8)*nheight]; fs.read (bdata, 0, (nwidth+npad8)*nheight); nindex8 = 0; for (int j8 = 0; j8 < nheight; j8++) { for (int i8 = 0; i8 < nwidth; i8++) { ndata8 [nwidth*(nheight-j8-1)+i8] = npalette [((int)bdata[nindex8]&0xff)]; nindex8++; } nindex8 += npad8; } image = createImage ( new MemoryImageSource (nwidth, nheight, ndata8, 0, nwidth)); } else { System.out.println ("Not a 24-bit or 8-bit Windows Bitmap, aborting..."); image = (Image)null; } fs.close(); return image; } catch (Exception e) { System.out.println("Caught exception in loadbitmap!"); } return (Image) null; } ImageIo类包含两个静态方法,read和write,通过这两个方法就可以完成对位图文件的读写。public class ZoomImage{ //下面两个常量设置缩小后图片的大小 private final int WIDTH = 80; private final int HEIGHT = 60; //定义个BuffedImage对象,用于保存缩小后的位图 BufferedImage image = new BufferedImage(WIDTH , HEIGHT , BufferedImage.TYPE_INT_RGB); Graphics g = image.getGraphics(); public void zoom()throws Exception { //读取原始位图 Image srcImage = ImageIO.read(new File("d:/我爱罗.bmp")); //将原始位图缩小后绘制到image图象中 g.drawImage(srcImage , 0 , 0 , WIDTH , HEIGHT , null); //将image图象文件输出到磁盘文件中。 ImageIO.write(image , "bmp" , new File("d:/copy我爱罗.bmp")); } public static void main(String[] args)throws Exception { new ZoomImage().zoom(); }} 我要的是将bmp的图像转成位图,不是变成灰度,希望各位帮帮忙。 Google或者百度一下 Java 灰度图 /** * 将彩色图像转换为灰度图。 * @param srcImage 源彩色图像。 * @param hints 重新绘图使用的 RenderingHints 对象。 * @return 目标灰度图。 */ public static BufferedImage transformGrayJ2D(BufferedImage srcImage,RenderingHints hints) { BufferedImage dstImage = new BufferedImage(srcImage.getWidth(), srcImage.getHeight(), srcImage.getType()); if (hints == null ) { Graphics2D g2 = dstImage.createGraphics(); hints = g2.getRenderingHints(); g2.dispose(); g2 = null ; } ColorSpace grayCS = ColorSpace.getInstance(ColorSpace.CS_GRAY); ColorConvertOp colorConvertOp = new ColorConvertOp(grayCS, hints); colorConvertOp.filter(srcImage, dstImage); return dstImage; } 做CS程序,用eclipse还是netbean好 高分问题,在线等 反射机制的问题,请教下,我知道类名,这个类名是个动态的,做强制转换 一个新人,请大家指点一二 关于MaskFormatter的错误 急问如何将excel文件转成txt文件 请教多线程 我要下载JAVA编程思想(第2版)(简体) 哪位能提供一下地址? anubis生日快乐~~~~~~~~~另祝大家新年快乐 各位看<think in java>第二版英文版,有什么心得吗?我英文不好,借助金山词霸,看的速度还超慢,好像一共有一千多页,不知道啥时候才能看完 代理网站的怎么处理url地址 JDAVMail登录Hotmail失败
{
Image image;
System.out.println("loading:"+sdir+sfile);
try
{
FileInputStream fs=new FileInputStream(sdir+sfile);
int bflen=14; // 14 byte BITMAPFILEHEADER
byte bf[]=new byte[bflen];
fs.read(bf,0,bflen);
int bilen=40; // 40-byte BITMAPINFOHEADER
byte bi[]=new byte[bilen];
fs.read(bi,0,bilen);
// Interperet data.
int nsize = (((int)bf[5]&0xff)<<24)
| (((int)bf[4]&0xff)<<16)
| (((int)bf[3]&0xff)<<8)
| (int)bf[2]&0xff;
System.out.println("File type is :"+(char)bf[0]+(char)bf[1]);
System.out.println("Size of file is :"+nsize);
int nbisize = (((int)bi[3]&0xff)<<24)
| (((int)bi[2]&0xff)<<16)
| (((int)bi[1]&0xff)<<8)
| (int)bi[0]&0xff;
System.out.println("Size of bitmapinfoheader is :"+nbisize);
int nwidth = (((int)bi[7]&0xff)<<24)
| (((int)bi[6]&0xff)<<16)
| (((int)bi[5]&0xff)<<8)
| (int)bi[4]&0xff;
System.out.println("Width is :"+nwidth);
int nheight = (((int)bi[11]&0xff)<<24)
| (((int)bi[10]&0xff)<<16)
| (((int)bi[9]&0xff)<<8)
| (int)bi[8]&0xff;
System.out.println("Height is :"+nheight);
int nplanes = (((int)bi[13]&0xff)<<8) | (int)bi[12]&0xff;
System.out.println("Planes is :"+nplanes);
int nbitcount = (((int)bi[15]&0xff)<<8) | (int)bi[14]&0xff;
System.out.println("BitCount is :"+nbitcount);
// Look for non-zero values to indicate compression
int ncompression = (((int)bi[19])<<24)
| (((int)bi[18])<<16)
| (((int)bi[17])<<8)
| (int)bi[16];
System.out.println("Compression is :"+ncompression);
int nsizeimage = (((int)bi[23]&0xff)<<24)
| (((int)bi[22]&0xff)<<16)
| (((int)bi[21]&0xff)<<8)
| (int)bi[20]&0xff;
System.out.println("SizeImage is :"+nsizeimage);
int nxpm = (((int)bi[27]&0xff)<<24)
| (((int)bi[26]&0xff)<<16)
| (((int)bi[25]&0xff)<<8)
| (int)bi[24]&0xff;
System.out.println("X-Pixels per meter is :"+nxpm);
int nypm = (((int)bi[31]&0xff)<<24)
| (((int)bi[30]&0xff)<<16)
| (((int)bi[29]&0xff)<<8)
| (int)bi[28]&0xff;
System.out.println("Y-Pixels per meter is :"+nypm);
int nclrused = (((int)bi[35]&0xff)<<24)
| (((int)bi[34]&0xff)<<16)
| (((int)bi[33]&0xff)<<8)
| (int)bi[32]&0xff;
System.out.println("Colors used are :"+nclrused);
int nclrimp = (((int)bi[39]&0xff)<<24)
| (((int)bi[38]&0xff)<<16)
| (((int)bi[37]&0xff)<<8)
| (int)bi[36]&0xff;
System.out.println("Colors important are :"+nclrimp);
if (nbitcount==24)
{
// No Palatte data for 24-bit format but scan lines are
// padded out to even 4-byte boundaries.
int npad = (nsizeimage / nheight) - nwidth * 3;
int ndata[] = new int [nheight * nwidth];
byte brgb[] = new byte [( nwidth + npad) * 3 * nheight];
fs.read (brgb, 0, (nwidth + npad) * 3 * nheight);
int nindex = 0;
for (int j = 0; j < nheight; j++)
{
for (int i = 0; i < nwidth; i++)
{
ndata [nwidth * (nheight - j - 1) + i] =
(255&0xff)<<24
| (((int)brgb[nindex+2]&0xff)<<16)
| (((int)brgb[nindex+1]&0xff)<<8)
| (int)brgb[nindex]&0xff;
// System.out.println("Encoded Color at ("
+i+","+j+")is:"+nrgb+" (R,G,B)= ("
+((int)(brgb[2]) & 0xff)+","
+((int)brgb[1]&0xff)+","
+((int)brgb[0]&0xff)+")");
nindex += 3;
}
nindex += npad;
}
image = createImage
( new MemoryImageSource (nwidth, nheight,
ndata, 0, nwidth));
}
else if (nbitcount == 8)
{
// Have to determine the number of colors, the clrsused
// parameter is dominant if it is greater than zero. If
// zero, calculate colors based on bitsperpixel.
int nNumColors = 0;
if (nclrused > 0)
{
nNumColors = nclrused;
}
else
{
nNumColors = (1&0xff)<<nbitcount;
}
System.out.println("The number of Colors is"+nNumColors);
// Some bitmaps do not have the sizeimage field calculated
// Ferret out these cases and fix 'em.
if (nsizeimage == 0)
{
nsizeimage = ((((nwidth*nbitcount)+31) & 31 ) >> 3);
nsizeimage *= nheight;
System.out.println("nsizeimage (backup) is"+nsizeimage);
}
// Read the palatte colors.
int npalette[] = new int [nNumColors];
byte bpalette[] = new byte [nNumColors*4];
fs.read (bpalette, 0, nNumColors*4);
int nindex8 = 0;
for (int n = 0; n < nNumColors; n++)
{
npalette[n] = (255&0xff)<<24
| (((int)bpalette[nindex8+2]&0xff)<<16)
| (((int)bpalette[nindex8+1]&0xff)<<8)
| (int)bpalette[nindex8]&0xff;
// System.out.println ("Palette Color "+n
+" is:"+npalette[n]+" (res,R,G,B)= ("
+((int)(bpalette[nindex8+3]) & 0xff)+","
+((int)(bpalette[nindex8+2]) & 0xff)+","
+((int)bpalette[nindex8+1]&0xff)+","
+((int)bpalette[nindex8]&0xff)+")");
nindex8 += 4;
}
// Read the image data (actually indices into the palette)
// Scan lines are still padded out to even 4-byte
// boundaries.
int npad8 = (nsizeimage / nheight) - nwidth;
System.out.println("nPad is:"+npad8);
int ndata8[] = new int [nwidth*nheight];
byte bdata[] = new byte [(nwidth+npad8)*nheight];
fs.read (bdata, 0, (nwidth+npad8)*nheight);
nindex8 = 0;
for (int j8 = 0; j8 < nheight; j8++)
{
for (int i8 = 0; i8 < nwidth; i8++)
{
ndata8 [nwidth*(nheight-j8-1)+i8] =
npalette [((int)bdata[nindex8]&0xff)];
nindex8++;
}
nindex8 += npad8;
}
image = createImage
( new MemoryImageSource (nwidth, nheight,
ndata8, 0, nwidth));
}
else
{
System.out.println ("Not a 24-bit or 8-bit Windows Bitmap, aborting...");
image = (Image)null;
}
fs.close();
return image;
}
catch (Exception e)
{
System.out.println("Caught exception in loadbitmap!");
}
return (Image) null;
}
{
//下面两个常量设置缩小后图片的大小
private final int WIDTH = 80;
private final int HEIGHT = 60;
//定义个BuffedImage对象,用于保存缩小后的位图
BufferedImage image = new BufferedImage(WIDTH , HEIGHT ,
BufferedImage.TYPE_INT_RGB);
Graphics g = image.getGraphics();
public void zoom()throws Exception
{
//读取原始位图
Image srcImage = ImageIO.read(new File("d:/我爱罗.bmp"));
//将原始位图缩小后绘制到image图象中
g.drawImage(srcImage , 0 , 0 , WIDTH , HEIGHT , null);
//将image图象文件输出到磁盘文件中。
ImageIO.write(image , "bmp" ,
new File("d:/copy我爱罗.bmp"));
}
public static void main(String[] args)throws Exception
{
new ZoomImage().zoom();
}
}
/**
* 将彩色图像转换为灰度图。
* @param srcImage 源彩色图像。
* @param hints 重新绘图使用的 RenderingHints 对象。
* @return 目标灰度图。
*/
public static BufferedImage transformGrayJ2D(BufferedImage srcImage,RenderingHints hints) {
BufferedImage dstImage = new BufferedImage(srcImage.getWidth(), srcImage.getHeight(), srcImage.getType());
if (hints == null ) {
Graphics2D g2 = dstImage.createGraphics();
hints = g2.getRenderingHints();
g2.dispose();
g2 = null ;
}
ColorSpace grayCS = ColorSpace.getInstance(ColorSpace.CS_GRAY);
ColorConvertOp colorConvertOp = new ColorConvertOp(grayCS, hints);
colorConvertOp.filter(srcImage, dstImage);
return dstImage;
}