c++读取24位BMP图像并处理

代码

本代码在vs2017上测试运行,由于工具不同可能要有所修改。 关于bmp 4字节对齐

#include <iostream>
#include <windows.h> 
using namespace std;

typedef struct
{
    BYTE b;
    BYTE g;
    BYTE r;
}RGB;
RGB imgOpr(RGB a)
{
    RGB b;
    b.b = 255-a.b;
    b.g = 255-a.g;
    b.r = 255-a.r;
    return b;
}
int main()
{
    BITMAPFILEHEADER fileHeader;
    BITMAPINFOHEADER infoHeader;
    FILE* pfin = fopen("D:/rotman.bmp", "rb");
    FILE* pfout = fopen("D:/imgSave.bmp", "wb");
    //Read the Bitmap file header;  
    fread(&fileHeader, sizeof(BITMAPFILEHEADER), 1, pfin);
    //Read the Bitmap info header;  
    fread(&infoHeader, sizeof(BITMAPINFOHEADER), 1, pfin);

    int height, weight;
    height = infoHeader.biHeight;
    weight = infoHeader.biWidth;
    if (infoHeader.biBitCount == 24)
    {
        int size = height * weight;
        RGB *img=new RGB[size];
        fread(img, sizeof(RGB), size, pfin);

        //对图片进行操作   
        int i;
        for (i = 0; i<size; i++){

                //对图片处理  
                img[i] = imgOpr(img[i]);
            }

        //将修改后的图片保存到文件   
        fwrite(&fileHeader, sizeof(fileHeader), 1, pfout);
        fwrite(&infoHeader, sizeof(infoHeader), 1, pfout);
        fwrite(img, sizeof(RGB), size, pfout);
    }else {
        cout << "非24位彩色图" << endl;
    }
    fclose(pfin);
    fclose(pfout);

    return 0;
}

结果

原图:看我头像



处理后图:
这里写图片描述

转化为灰度图

(实际上还是24位,没有颜色表,RGB占一个像元)处理代码:

RGB imgOpr(RGB a)
{
    RGB b;
    int i = (a.b + a.g + a.r) / 3;
    b.b = i;
    b.g = i;
    b.r = i;
    return b;
}

这里写图片描述

  • 2
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
VC++ JPEG与BMP图像JPG图形库只有14个函数,他们都是非常有用的: 1. void init_jpeg() <---jpgdll中的函数 1. void init_jpeg1() <--jpegdll中的函数 本函数初始化JPEG API动态链接库,它必须在其它JPEG API函数之前调用。在程序中此函数只须调用一次。 函数调用语句样例: init_jpeg(); . 2. void findwindow(char *title) 1. void findwindow1(char *title) 本函数取程序窗口的图形句柄,用于其它函数绘图处理。 Title为程序窗口的标题,若标题很长,取前几个字就可以了。 函数调用语句样例: hl=findwindow("JPEG TEST"); . 3. long showjpg(char *fliename, long hwnd, long left, long top) 2. long showjpg1(char *fliename, long hwnd, long left, long top) 本函数打开一个JPG图形文件,并在窗口的(left,top)置显示。 hwnd为窗口图形句柄,(left,top)为图形显示的左上角置。 函数调用语句样例: rs=showjpg("c:\jpgdemo\demo.jpg",hwnd,10,10) .. 4. long show_bmp(char *fliename, long hwnd, long left, long top) 3. long show_bmp1(char *fliename, long hwnd, long left, long top) 本函数打开一个BMP图形文件,并在窗口的(left,top)置显示。 hwnd为窗口图形句柄,(left,top)为图形显示的左上角置。 函数调用语句样例: rs=showbmp("c:\jpgdemo\demo.bmp",hwnd,10,10) . 5. long jpg_to_bmp(char *jpgfilename, char *bmpfilename) 5. long jpg_to_bmp1(char *jpgfilename, char *bmpfilename) 本函数将一个JPG图形文件换为BMP图形文件。 函数调用语句样例: rs=jpg_to_bmp("c:\jpgdemo\demo.jpg","c:\temp\demo.bmp") . 6. long bmp_to_jpg(char *jpgfilename, char *bmpfilename,long quality) 5. long bmp_to_jpg1(char *jpgfilename, char *bmpfilename,long quality) 本函数将一个BMP图形文件换为JPG图形文件。 Quality为换的质量和图形压缩情况,取值0-100。一般取75。 函数调用语句样例: rs=bmp_to_jpg("c:\jpgdemo\demo.bmp","c:\temp\demo.jpg",75) . 7. long copy_to_bmp(long hwnd, char *bmpfilename, long type) 6. long copy_to_bmp1(long hwnd, char *bmpfilename, long type) 本函数将程序窗口内容硬拷贝到一个BMP图形文件。 hwnd为窗口图形句柄, Type=0, 拷贝整个窗口。 Type=1, 拷贝用户区域 函数调用语句样例: rs=copy_to_bmp("c:\temp\demo.bmp",hwnd,0) . 8. long copy_to_jpeg(long hwnd, char *bmpfilename, long type,long quality) 7. long copy_to_jpeg1(long hwnd, char *bmpfilename, long type,long quality) 本函数将程序窗口内容硬拷贝到一个JPG图形文件。 hwnd为窗口图形句柄, Type=0, 拷贝整个窗口。 Type=1, 拷贝用户区域 quality为图形质量,取值0-100。一般取75。 函数调用语句样例: rs=copy_to_jpeg("c:\temp\demo.jpeg",hwnd,0,75) . 9. long to_clip(long hwnd, long type) 8. long to_clip1(long hwnd, long type) 本函数将程序窗口内容硬拷贝到剪贴板,你可以用"Paste"方式在其它图形软件中编辑。 hwnd为窗口图形句柄, Type=0, 拷贝整个窗口。 Type=1, 拷贝用户区域 函数调用语句样例: rs=to_clip(hwnd,0) . 10. long clip_to_jpeg(char *name,long hl,long quality) 10 long clip_to_jpeg1(char *name,long hl,long quality) 本函数将当前剪贴板上的图形硬拷贝到一个JPG图形文件。 hwnd为窗口图形句柄, Type=0, 拷贝整个窗口。 Type=1, 拷贝用户区域 quality为图形质量,取值0-100。一般取75。 函数调用语句样例: rs=clip_to_jpeg("bird2.jpg",hWnd,75); . 11. long clip_to_bmp(char *name,long hl) 11. long clip_to_bmp1(char *name,long hl) 本函数将当前剪贴板上的图形硬拷贝到一个JPG图形文件。 hwnd为窗口图形句柄, 函数调用语句样例: rs=clip_to_bmp("bird2.bmp",hWnd,75); . 12. void Area_Copy(long hl,long left,long top,long w,long h) 12. void Area_Copy1(long hl,long left,long top,long w,long h) 本函数将程序窗口上的一个区域的内容硬拷贝到剪贴板,你可以用"Paste"方式在其它图形软件中编辑。 hwnd为窗口图形句柄, (left,top)为图形拷贝区域左上角置 w为图形拷贝区域的宽度 h为图形拷贝区域的高宽度 函数调用语句样例:Area_Copy(hWnd,0,0,300,400); . 13. long Area_to_jpeg(long hl,long left,long top,long w,long h,char * name,long qa) 13.long Area_to_jpeg1(long hl,long left,long top,long w,long h,char * name,long qa) 本函数将程序窗口上的一个区域的内容硬拷贝到JPG图形文件。 hwnd为窗口图形句柄, (left,top)为图形拷贝区域左上角置 w为图形拷贝区域的宽度 h为图形拷贝区域的高宽度 quality为图形质量,取值0-100。一般取75。 函数调用语句样例:Area_to_jpeg(hWnd,0,0,300,400,"bird3.jpg",75); . 14. long Area_to_bmp(long hl,long left,long top,long w,long h,char * name) 14. long Area_to_bmp1(long hl,long left,long top,long w,long h,char * name) 本函数将程序窗口上的一个区域的内容硬拷贝到BMP图形文件。 hwnd为窗口图形句柄, (left,top)为图形拷贝区域左上角置 w为图形拷贝区域的宽度 h为图形拷贝区域的高宽度 函数调用语句样例:Area_to_bmp(hWnd,0,0,300,400,"bird3.bmp");
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值