資源簡介
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?< /*讀取顏色表*/
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
評論
共有 條評論