RGB888转RGB666
发布时间
阅读量:
阅读量
内存中的数据排列高位在左,低位在右
RGB888->RGB666
高 -------低
B[3] B[2] B[1] B[0] B[3] B[2]
RGB888 RRRRRRRR GGGGGGGG BBBBBBB RRRRRRRR GGGGGGGG BBBBBBBB
A[2] A[1] A[0] A[2] A[1]
RGB666 RRRRRRGG GGGGBBBB BBRRRRRR GGGGGGBB BBBB
RGB888->RGB565
高-----------低
B[2] B[1] B[0]
RGB888 RRRRRRRR GGGGGGGG BBBBBBBB
A[1] A[0]
RGB565 RRRRRGGG GGGBBBBB
代码
"stdafx.h"
#include
#include
#include string
#include
#include usingnamespace std;
#define
typedef unsigned char BYTE;
typedef unsigned short WORD;
typedef unsigned long DWORD;
typedef long LONG;
//位图文件头信息结构定义
//其中不包含文件类型信息(由于结构体的内存结构决定,要是加了的话将不能正确读取文件信息)struct HS_tagBITMAPFILEHEADER{
WORD bfType;//固定为0x4d42//文件大小//保留字,不考虑//保留字,同上//实际位图数据的偏移字节数,即前三个部分长度之和}HS_BITMAPFILEHEADER;
//信息头BITMAPINFOHEADER,也是一个定义,其定义如下:struct HS_tagBITMAPINFOHEADER{
DWORD biSize; //指定此结构体的长度,为40//位图宽//位图高//平面数,为1//采用颜色位数,可以是1,2,4,8,16,24,新的可以是32//压缩方式,可以是0,1,2,其中0表示不压缩//实际位图数据占用的字节数//X方向分辨率//Y方向分辨率//使用的颜色数,如果为0,则表示默认值(2^颜色位数)//重要颜色数,如果为0,则表示所有颜色都是重要的}HS_BITMAPINFOHEADER;
//调色板Palette,当然,这里是对那些需要调色板的位图文件而言的。24位和32位是不需要调色板的。
//(似乎是调色板结构体个数等于使用的颜色数。)
typedef struct HS_tagRGBQUAD {
//public://该颜色的蓝色分量//该颜色的绿色分量//该颜色的红色分量//保留值} HS_RGBQUAD;
void pBmpHead)
{
printf("位图文件头:\n");
printf("bmp格式标志bftype:0x%x\n"bfType);
printf("文件大小:%d\n"bfSize);
printf("保留字1:%d\n"bfReserved1);
printf("保留字2:%d\n"bfReserved2);
printf("实际位图数据的偏移字节数:%d\n"bfOffBits);
}
void pBmpInfoHead)
{
printf("位图信息头:\n");
printf("此结构体的长度:%d\n"biSize);
printf("位图宽:%d\n"biWidth);
printf("位图高:%d\n"biHeight);
printf("biPlanes平面数:%d\n"biPlanes);
printf("biBitCount采用颜色位数:%d\n"biBitCount);
printf("压缩方式:%d\n"biCompression);
printf("biSizeImage实际位图数据占用的字节数:%d\n"biSizeImage);
printf("X方向分辨率:%d\n"biXPelsPerMeter);
printf("Y方向分辨率:%d\n"biYPelsPerMeter);
printf("使用的颜色数:%d\n"biClrUsed);
printf("重要颜色数:%d\n"biClrImportant);
}
void pRGB)
{
printf("(%-3d,%-3d,%-3d) "rgbBlue);
}
FILE fp_write;
void pBmpHead){
fwrite(12, fp_write);
fwrite(14, fp_write);
fwrite(12, fp_write);
fwrite(12, fp_write);
fwrite(14, fp_write);
// fwrite(pBmpHead, 1, 14, fp_write);}
void pBmpInfoHead)
{
fwrite(pBmpInfoHead, 140, fp_write);
}
voidintint height){
int0;
int0;
for03)
{
rgb16[j] 0xF13;
rgb16[j] 10x1C3;
rgb16[j 120xF8;
rgb16[j 110xF05;
j 2;
}
}
WORD rgb_24_2_565(intintint b)
{
return80xF800
((unsigned(g) 30x7E0
((unsigned(b) 3)));
}
voidintint height){
int0;
int0;
for04)
{
rgb18[j] 2;
rgb18[j] 10x0C4 );
rgb18[j110xF04;
rgb18[j1120x3C2 );
rgb18[j220xC06;
rgb18[j2230xFC;
j 3;
}
}
intconstcharstringpicturePath)
{
char100] ;
char szFind[MAX_PATH];
WIN32_FIND_DATA FindFileData;
strcpy(szFind,lpPath);
strcat(szFind,"\ *.*");
HANDLE hFindFindFileData);
if hFind)
return1;
do
{
if FILE_ATTRIBUTE_DIRECTORY)
{
if"."0".."0)
{
//发现子目录,递归之char0};
strcpy(szFile,lpPath);
strcat(szFile,"\ ");
strcat(szFile,FindFileData.cFileName);
find_all_files(szFile, picturePath);
}
}
else
{
//找到文件,处理之string lpPath;
strPicturePath "\ " ;
strPicturePath FindFileData.cFileName;
picturePathpush_back(strPicturePath);
}
}whileFindFileData));
::FindClose(hFind);
return0;
}
void main()
{
HS_BITMAPFILEHEADER bitHead;
HS_BITMAPINFOHEADER bitInfoHead;
FILE pfile;
char50];
charBmpFileHeader;
WORD temp_WORD;
DWORD temp_DWORD;
string strPicturePath;
string strPictureName;
printf("please input the file path:\n");
scanf("%s",filePath);
liststring picturesPath;
find_all_files(filePath, picturesPath);
BmpFileHeadercharcalloc14sizeofchar));
forstringit){
strPicturePath it;
pfile "rb"//打开文件ifNULL)
{
memset(BmpFileHeader, 014);
fread(BmpFileHeader,114,pfile);
temp_WORD )(BmpFileHeader);
bitHead.bfTypetemp_WORD;
if0x4d42)
{
printf("file is not .bmp file!");
continue;
}
temp_DWORDsizeof(bitHead.bfType));
bitHead.bfSizetemp_DWORD;
temp_WORDsizeofsizeof(bitHead.bfSize));
bitHead.bfReserved1temp_WORD;
temp_WORDsizeofsizeofsizeof(bitHead.bfReserved1));
bitHead.bfReserved2temp_WORD;
temp_DWORDsizeofsizeofsizeofsizeof(bitHead.bfReserved2));
bitHead.bfOffBitstemp_DWORD;
//showBmpHead(&bitHead);
//printf("\n\n");
//写头文int"\ ");
strPictureName 1);
fp_write "wb");
//fp_write = fopen("NC_001_16.bmp", "wb");
//fp_write = fopen("NC_001_24.bmp", "wb");
//读取位图信息头信息1sizeof(HS_BITMAPINFOHEADER),pfile);
bitHead.bfSize 1854;
//bitHead.bfSize = WIDTHBYTES(bitInfoHead.biWidth*16) * bitInfoHead.biHeight + 54;
//bitHead.bfSize = WIDTHBYTES(bitInfoHead.biWidth*24) * bitInfoHead.biHeight + 54;bitHead);
//showBmpInfoHead(&bitInfoHead);
//printf("\n");18;
//bitInfoHead.biBitCount = 16;
//bitInfoHead.biBitCount = 24;0;
bitInfoHead.biSizeImage 0;
bitInfoHead.biXPelsPerMeter 0;
bitInfoHead.biYPelsPerMeter 0;
bitInfoHead.biClrUsed 0;
bitInfoHead.biClrImportant 0;
writeRgb18InfoHead(bitInfoHead);
int bitInfoHead.biWidth;
int bitInfoHead.biHeight;
int24//计算位图的实际宽度并确保它为32的倍数mallocl_width);
memset(pColorData,0l_width);
longl_width;
//把位图数据信息读到数组里1,nData,pfile);
int bitInfoHead.biBitCount);
BYTEmalloc height);
//rgb24_to_rgb565(pColorData,rgb16, l_width,height); rgb24_to_rgb666(pColorData,rgb16, l_width,height);
fwrite(rgb16, 1 height, fp_write);
fclose(pfile);
fclose(fp_write);
free(pColorData);
free(rgb16);
}
else
{
printf("file open fail!\n");
}
}
free(BmpFileHeader);
printf("successed!");
}
全部评论 (0)
还没有任何评论哟~
