读取bmp图片数据

 1 public  void getBMPImage(String source) throws Exception {
 2
 3          clearNData();                        //清除数据保存区
 4          FileInputStream fs = null;
 5
 6         try {
 7             fs = new FileInputStream(source);
 8             int bfLen = 14;
 9             byte bf[] = new byte[bfLen];
10             fs.read(bf, 0, bfLen); // 读取14字节BMP文件头
11             int biLen = 40;
12             byte bi[] = new byte[biLen];
13             fs.read(bi, 0, biLen); // 读取40字节BMP信息头
14             // 源图宽度
15             nWidth = (((int) bi[7] & 0xff) << 24)
16                     | (((int) bi[6] & 0xff) << 16)
17                     | (((int) bi[5] & 0xff) << 8) | (int) bi[4] & 0xff;
18             // 源图高度
19             nHeight = (((int) bi[11] & 0xff) << 24)
20                     | (((int) bi[10] & 0xff) << 16)
21                     | (((int) bi[9] & 0xff) << 8) | (int) bi[8] & 0xff;
22             // 位数
23             nBitCount = (((int) bi[15] & 0xff) << 8) | (int) bi[14] & 0xff;
24             // 源图大小
25             int nSizeImage = (((int) bi[23] & 0xff) << 24)
26                     | (((int) bi[22] & 0xff) << 16)
27                     | (((int) bi[21] & 0xff) << 8) | (int) bi[20] & 0xff;
28             // 对24位BMP进行解析
29             if (nBitCount == 24){
30                 int nPad = (nSizeImage / nHeight) - nWidth * 3;
31                 nData = new int[nHeight * nWidth];
32                 nB=new int[nHeight * nWidth];
33                 nR=new int[nHeight * nWidth];
34                 nG=new int[nHeight * nWidth];
35                 byte bRGB[] = new byte[(nWidth + nPad) * 3 * nHeight];
36                 fs.read(bRGB, 0, (nWidth + nPad) * 3 * nHeight);
37                 int nIndex = 0;
38                 for (int j = 0; j < nHeight; j++){
39                     for (int i = 0; i < nWidth; i++) {
40                         nData[nWidth * (nHeight - j - 1) + i] = (255 & 0xff) << 24
41                                 | (((int) bRGB[nIndex + 2] & 0xff) << 16)
42                                  | (((int) bRGB[nIndex + 1] & 0xff) << 8)
43                                 | (int) bRGB[nIndex] & 0xff;
44                         nB[nWidth * (nHeight - j - 1) + i]=(int) bRGB[nIndex]& 0xff;
45                         nG[nWidth * (nHeight - j - 1) + i]=(int) bRGB[nIndex+1]& 0xff;
46                         nR[nWidth * (nHeight - j - 1) + i]=(int) bRGB[nIndex+2]& 0xff;
47                         nIndex += 3;
48                     }
49                     nIndex += nPad;
50                 }
51  //               Toolkit kit = Toolkit.getDefaultToolkit();
52  //               image = kit.createImage(new MemoryImageSource(nWidth, nHeight,
53  //                       nData, 0, nWidth));
54 /*
55 //调试数据的读取
56                 FileWriter fw = new FileWriter("C:\\Documents and Settings\\Administrator\\My Documents\\nDataRaw.txt");//创建新文件
57                 PrintWriter out = new PrintWriter(fw);
58                 for(int j=0;j<nHeight;j++){
59                  for(int i=0;i<nWidth;i++){
60                   out.print((65536*256+nData[nWidth * (nHeight - j - 1) + i])+"_"
61                     +nR[nWidth * (nHeight - j - 1) + i]+"_"
62                     +nG[nWidth * (nHeight - j - 1) + i]+"_"
63                     +nB[nWidth * (nHeight - j - 1) + i]+" ");
64
65                  }
66                  out.println("");
67                 }
68                 out.close();
69 */
70             }
71         }
72         catch (Exception e) {
73             e.printStackTrace();
74             throw new Exception(e);
75         }
76         finally {
77             if (fs != null) {
78                 fs.close();
79             }
80         }
81      //   return image;
82     }
时间: 2024-08-30 02:48:13

读取bmp图片数据的相关文章

bmp图片数据提取

仿照别人的程序写的bmp数据提取C代码,并将提取的数据放到txt文档中 1 /* 2 date : 2014/06/24 3 designer :pengxiaoen 4 version : dev4.9.9.0 5 function :读取bmp图片的图片数据信息到文件txt中.参考了其他的程序 6 7 bmp 文件格式: 第10个字节处存放图像数据起始地址 —— 此程序中25行用到 8 第36h - 0436h 字节处存放调色板 —— 此程序中没有用到 9 10 **************

C++读取BMP位图数据的方法

图片文件是有固定格式的,像BMP图片:文件头+位图的颜色数据. 文件头一般在读取的时候是使用下面的代码: BITMAPFILEHEADER fileheader={0}; fread(&fileheader,sizeof(fileheader),1,fp); if(fileheader.bfType!=0x4D42) // 判断是否为BMP图片 { fclose(fp); return ; } BITMAPINFOHEADER head; fread(&head,sizeof(BITMAP

OPENGL 显示BMP图片+旋转

VS2010/Windows 7/ 1. 需包含头文件 stdio.h, glaux.h, glut.h.需要对应的lib,并添加包含路径 2. 窗口显示用glut库的函数 3. bmp图片从本地读取,再用它来生成纹理,首先用auxDIBImageLoad函数将图片数据读到AUX_RGBImageRec结构体当中. 然后 //生成纹理数据 glTexImage2D(GL_TEXTURE_2D, 0, 3, TextureImage[0]->sizeX, TextureImage[0]->siz

MFC 对话框Picture Control(图片控件)中静态和动态显示Bmp图片

最近有同学问我如何实现MFC基于对话框在图片控件中加载图片?其实使用MFC显示图片的方法各种各样,但是还是有些同学不知道怎样显示.以前在<数字图像处理>课程中完成的软件都是基于单文档的程序,这里介绍两种在对话框picthre控件中显示BMP图片的最简单基础的方法. ~~方法可能并不完美,高手忽略,但是提供一种能运行的方法,希望对刚接触这方面知识的同学有所帮助.可能你觉得文章过于简单或者有些过于详细叙述(点到即可我并不反对),但也为哪些入门同学想想,当初自己也是一头雾水. 一.静态显示bmp图片

简易bmp图片读取

BMP全称bitmap(位图),是windows中的标准图像文件格式,可以读入一张bmp图像作为纹理. 以下是我目前正在使用的位图加载类.首先是头文件: #define swapcolor(a,b){ (a) ^= (b); (b) ^= (a); (a) ^= (b); } class BmpLoader { private: unsigned char* header;//文件头 unsigned int dataPos;//读取位置 unsigned int width, height;/

mp3 音频 音乐 tag ID3 ID3V1 ID3V2 标签 读取信息 获得图片 jpeg bmp 图片转换等

mp3 音频 音乐 tag ID3 ID3V1 ID3V2 标签 读取信息 获得图片 jpeg bmp 图片转换(上) MP3文件格式(二)---ID3v2 图:ID3V1标签结构 图:ID3V2标签结构 图:ID3V2头结构 图:ID3V2帧头结构 1.帧标识  用四个字符标识一个帧,说明一个帧的内容含义,常用的对照如下:  TIT2=标题 表示内容为这首歌的标题,下同  TPE1=作者  TALB=专集  TRCK=音轨 格式:N/M  其中N为专集中的第N首,M为专集中共M首,N和M为AS

将图片数据转化为TFRecord格式与读取

将图片数据转化为TFRecord格式与读取 一.问题情景描述 目录下有一个叫做"Original"的文件夹,文件夹里有十个子文件,分别命名为1,2···一直到10(为了做10轮取平均),这10个子文件夹里还有四个子文件夹,分别命名为"train0","train1","test0","test1".其中含义如其命名所示.这四个子文件夹里一共有若干张JPG格式图像数据.现欲将这份图像数据转化为TFRecord

iOS读取图片数据的两种方法:UIImageJPEG和UIImagePNG

UIImageJPEGRepresentation函数有两个参数:引用的图片和压缩系数. UIImagePNGRepresentation(UIImage * image)函数只有一个引用图片参数. UIImagePNGRepresentation(UIImage * image)要比UIImageJPEGPresentation(UIImage * image, 1.0)返回的图片数据量大很多,如果对图片清晰度要求不高,可以通过设置UIImageJPEGReprentation的第二个参数,大

Linux framebuffer显示bmp图片

framebuffer简介     帧缓冲(framebuffer)是Linux为显示设备提供的一个接口,把显存抽象后的一种设备,他允许上层应用程序在图形模式下直接对显示缓冲区进行读写操作.framebuffer是LCD对应的一中HAL(硬件抽象层),提供抽象的,统一的接口操作,用户不必关心硬件层是怎么实施的.这些都是由Framebuffer设备驱动来完成的.     帧缓冲设备对应的设备文件为/dev/fb*,如果系统有多个显示卡,Linux下还可支持多个帧缓冲设备,最多可达32个,分别为/d