资源简介
bmp文件的读取,可以获得其RGB值,并能按给定大小保存成bmp文件
bmp file to read, get their RGB values, and preservation of a given size into a bmp file
代码片段和文件信息
#include “img.h“
#define __WIN32__
#ifdef __WIN32__
#include
#include
// BMP文件头
#pragma pack(push2)
typedef struct {
uint16_t bfType; // 文件类型
uint32_t bfSize; // 文件大小
uint16_t bfReserved1; // 保留位
uint16_t bfReserved2; // 保留位
uint32_t bfOffBits; // 数据偏移位置
}BMPFILEHEADER;
#pragma pack(pop)
// BMP信息头
typedef struct {
uint32_t biSize; /*此结构大小*/
int32_t biWidth; /*图像宽度*/
int32_t biHeight; // 图像高度
uint16_t biPlanes; // 调色板数量
uint16_t biBitCount; // 每个象素对应的位数,24:24位图,32:带alpha通道的24位图
uint32_t biCompression; // 压缩
uint32_t biSizeImage; // 图像大小
int32_t biXPelsPerMeter;// 横向分辨率
int32_t biYPelsPerMeter;// 纵向分辨率
uint32_t biClrUsed; // 颜色使用数
uint32_t biClrImportant; // 重要颜色数
}BMPINFOHEADER;
/*BMP 调色板信息结构*/
typedef struct tagRGBQUAD {
uint8_t rgbBlue;
uint8_t rgbGreen;
uint8_t rgbRed;
uint8_t rgbReserved;
} RGBQUAD;
#define WIDTHBYTES(i) ((i+31)/32*4)
/*
*读取bmp格式文件,同时把24位彩色转换成256色的灰度图象
* *img: 图象数据存储对象.
* *filename: BMP文件名.
*/
static int8_t read_image_bmp_win32(image_t *img const int8_t *filename)
{
int i j k pixel_size;
uint8_t temp;
FILE *file;
BMPFILEHEADER bmpFile;
BMPINFOHEADER bmpInfo;
RGBQUAD rgb[256];
uint8_t *img_data *ptr_cur;
uint32_t image_sizeline_bytesoffset;
file = fopen(filename“rb “);
if (file == NULL) {
printf(“Open File Error \n“);
return -1;
}
/*获取BMP文件头和信息头*/
rewind(file);
fread(&bmpFile sizeof(BMPFILEHEADER) 1 file);
fread(&bmpInfo sizeof(BMPINFOHEADER) 1 file);
/*验证文件类型 */
if (bmpFile.bfType != 0x4D42) {
printf(“File Type Error \n“);
fclose(file);
return -1;
}
/*获取图像色彩数 */
pixel_size = bmpInfo.biBitCount >> 3;
img->height = bmpInfo.biHeight;
img->width = bmpInfo.biWidth;
line_bytes = img->width * pixel_size + 3 - ((img->width * pixel_size + 3) & 3);
image_size = img->height * line_bytes;
img_data = (uint8_t*)malloc(image_size * sizeof(uint8_t));
if(NULL == img_data )
{
printf(“malloc img_data errornot enough memory !\n“);
fclose(file);
return -1;
}
img->release_image(img);
img->data = (uint8_t*)malloc(img->height * img->width);
if(NULL == img->data )
{
printf(“malloc img_data errornot enough memory !\n“);
free(img_data);
fclose(file);
return -1;
}
offset = 1 << bmpInfo.biBitCount;
/*读取颜色表*/
if(bmpInfo.biBitCount <= 8)
fread(rgb4offsetfile);
/* 读取图象数据*/
fread(img_data 1 image_size file);
if(1 == pixel_size)/*256色BMP*/
{
for( i=0; iheight; ++i)
{
memcpy(img->data + img->width * iimg_data + ((img->height - i - 1) * line_bytes)img->width);
}
}
else if(3 == pixel_size)/*24位BMP*/
{
init_RGB_table();
k = 0;
/*转换RGB格式的亮度值Y*/
for (i=0; iheight; i++)
{
for (j=0; jwidth; j++)
{
ptr_cur = img_data + ((im
属性 大小 日期 时间 名称
----------- --------- ---------- ----- ----
文件 5639 2008-07-08 16:18 imagedeblur\bmpio.c
文件 4576 2008-07-14 19:37 imagedeblur\imagedeblur.dsp
文件 530 2008-07-14 09:53 imagedeblur\imagedeblur.dsw
文件 58368 2008-09-10 17:10 imagedeblur\imagedeblur.ncb
文件 49664 2008-09-10 17:10 imagedeblur\imagedeblur.opt
文件 256 2008-09-10 17:10 imagedeblur\imagedeblur.plg
文件 4084 2008-07-15 09:22 imagedeblur\img.c
文件 2559 2008-07-14 09:54 imagedeblur\img.h
文件 1450 2008-07-14 18:38 imagedeblur\img_ba
文件 637 2008-07-15 09:49 imagedeblur\test.c
文件 786488 2008-07-07 20:40 imagedeblur\test2(512.10).bmp
文件 263222 2008-07-15 09:22 imagedeblur\test2out(512.10).bmp
文件 197686 2008-09-10 17:10 imagedeblur\testy1(30.15).bmp
文件 589880 2008-07-15 09:47 imagedeblur\y1(30.15).bmp
目录 0 2008-09-10 17:21 imagedeblur
----------- --------- ---------- ----- ----
1965257 16
评论
共有 条评论