資源簡介
本程序借助libpng和libjpeg庫 ,以C++類的方式實現linux下對png jpg和bmp常見類型的圖像文件的讀寫。要在程序中顯示圖像可自行用opengl或其他方式完成。
代碼片段和文件信息
#include“bmp.h“
#include“ImageHandler.h“
#include?“include.h“
CBMPHandler::CBMPHandler()
{
}
CBMPHandler::~CBMPHandler()
{
}
int?CBMPHandler::WriteBMPfile(const?char*?filename?CImageInfo?&img)
{
?????FILE*?????pWritingFile=NULL;
??????pWritingFile?=?fopen(filename?“wb“);
?????if(?pWritingFile?==?NULL?)
?????{
???????????perror(“fopen“);
???????????return?-1;
?????}
?????//計算圖像字節數
?????unsigned?int?PixelDataLength=img.GetSize();
????BITMAPFILEHEADER?FileHeader;????//接受位圖文件頭
????BITMAPINFOHEADER?InfoHeader;????//接受位圖信息頭
????FileHeader.bfType=BITMAP_ID;??????????????????????????????????????????????????//ID設置為位圖的id號
?????FileHeader.bfOffBits=sizeof(BITMAPFILEHEADER)+sizeof(BITMAPINFOHEADER);??????//實際圖像數據的位置在文件頭和信息頭之后
?????FileHeader.bfReserved1=0;????????????????????????????????????????????????????//必須設置為0
?????FileHeader.bfReserved2=0;????????????????????????????????????????????????????//必須設置為0
?????FileHeader.bfSize=PixelDataLength+FileHeader.bfOffBits;??????????????????????//BMP圖像文件大小
????InfoHeader.biXPelsPerMeter?=?0;??????????????????????????????????????????????//水平分辨率,這里暫時設為0就是
????InfoHeader.biYPelsPerMeter?=?0;??????????????????????????????????????????????//垂直分辨率,這里暫時設為0就是
????InfoHeader.biClrUsed?=?0;????????????????????????????????????????????????????//圖像使用的顏色,這里暫時設為0就是
????InfoHeader.biClrImportant?=?0;????????????????????????????????????????????????//重要的顏色數,這里暫時設為0就是????????????????????????//垂直分辨率,這里暫時設為0就是
????InfoHeader.biPlanes=1;????????????????//必須設置為1
????InfoHeader.biCompression=0;??????????????????????????????????????????????//設置為BI_RGB時表示圖像并沒有彩色表
????InfoHeader.biBitCount=img.GetChannels()*8;????????????????????????????????????????????????????//圖像的位數
????InfoHeader.biSize=sizeof(BITMAPINFOHEADER);??????????????????????????????????//結構體的大小
????InfoHeader.biHeight=img.GetHeight();
????InfoHeader.biWidth=img.GetWidth();
????InfoHeader.biSizeImage=PixelDataLength;
????CImageInfo?tmp=img;
????tmp.ConvergeOrder();//轉化為?bgr(A)
????fwrite(&FileHeader?sizeof(BITMAPFILEHEADER)?1?pWritingFile);
????fwrite(&InfoHeader?sizeof(BITMAPINFOHEADER)?1?pWritingFile);
????fwrite(tmp.GetData()?InfoHeader.biSizeImage?1?pWritingFile);
?????//?釋放內存和關閉文件
?????fclose(pWritingFile);
?????return?0;
}
int?CBMPHandler::ReadBMPfile(const?char*?filenameCImageInfo?*img)
{
?????FILE*?pWritingFile?=?fopen(filename?“rb“);
?????if(?pWritingFile?==?NULL?)
?????{
???????????perror(“fopen“);
???????????return?-1;
?????}
?????BITMAPFILEHEADER?FileHeader;????//接受位圖文件頭
????BITMAPINFOHEADER?InfoHeader;????//接受位圖信息頭
????fread(&FileHeader?sizeof(BITMAPFILEHEADER)?1?pWritingFile);
???fread(&InfoHeader?sizeof(BITMAPINFOHEADER)?1?pWritingFile);
???char?buf[1024];
???fread(bufFileHeader.bfOffBits-sizeof(BITMAPFILEHEADER)-sizeof(BITMAPINFOHEADER)1pWritingFile);
???//獲取圖像寬度,高度,大小
???int?width=InfoHeader.biWidth;
????int?height=InfoHeader.biHeight;
????int?PixelDataLength=FileHeader.bfSize-FileHeader.bfOffBits;
????int?Channels=InfoHeader.biBitCount/
- 上一篇:圖書管理系統 C語言設計源代碼和實驗報告
- 下一篇:走迷宮程序C++
評論
共有 條評論