Advertisement

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)

还没有任何评论哟~