• 设为首页
  • 点击收藏
  • 手机版
    手机扫一扫访问
    迪恩网络手机版
  • 关注官方公众号
    微信扫一扫关注
    公众号

C++读取、旋转和保存bmp图像文件编程实现

原作者: [db:作者] 来自: [db:来源] 收藏 邀请

     以前也遇到过bmp文件的读写。这篇博客很好,写的其他内容也值得学习。

     参考:http://blog.csdn.net/xiajun07061225/article/details/6633938  学习

      在读取bmp图片的时候,一定要注意内存对齐的问题,譬如文件头,否则无法读取出正确结果。

关于图片的像素数据,每一行的像素的字节数必须是4的整数倍。如果不是,则需要补齐。一般来说,bmp图像文件的数据是从下到上,从左到右的。即从文件中最先读到的是图像最下面一行的左边第一个像素,然后是坐标第二个.....接下来是倒数第二行的第一个像素。

灰度图:

      灰度图是只含亮度信息,不含彩色信息的图像。bmp格式文件中并没有灰度图这个概念,但是我们很容易地用bmp文件来表示灰度图。方法是用256色的调色板,只不过这个调色板有点特殊,每一项的RGB值都是相同的,从(0,0,0),(1,1,1),...,一直到(255,255,255)。这样,灰度图就可以用256色图来表示了。其图像数据就是调色板索引值,也就是实际的RGB的亮度值。另外因为是256色的调色板,所以图像数据中的一个字节代表一个像素。如果是彩色的256色图,图像处理后可能会产生不属于这256色的颜色,所以,图像处理一般采用灰度图。

调色板,真彩色,DDB,DIB,BMP,RGB,YUV

int loadBitmapFromFile(const char *filePath, U8 **bits)
{
    FILE *fp = fopen(filePath, "rb");
    if (fp == NULL) {
        return 0;
    }
    BITMAPFILEHEADER bfh;
    if (fread(&bfh, sizeof(bfh), 1, fp) != 1) {
        fclose(fp);
        return 0;
    }
    BITMAPINFOHEADER bih;
    if (fread(&bih, sizeof(bih), 1, fp) != 1) {
        fclose(fp);
        return 0;
    }
    if (bih.biBitCount != 8) {
        fclose(fp);
        printf("unsupported bitmap format.\n");
        return 0;
    }
    fseek(fp, bfh.bfOffBits - sizeof(bfh) - sizeof(bih), SEEK_CUR);  //将文件指针移动到离当前位置(调色板大小)字节处
    int imageSize = (bih.biWidth + 3) / 4 * 4 * bih.biHeight;
    U8 *buffer = (U8 *)malloc(imageSize);
    if (fread(buffer, 1, imageSize, fp) != imageSize) {
        fclose(fp);
        return 0;
    }

    fclose(fp);

    *bits = buffer;

    return imageSize;
}

 


鲜花

握手

雷人

路过

鸡蛋
该文章已有0人参与评论

请发表评论

全部评论

专题导读
上一篇:
[C++]前向声明(forwarddeclaration)发布时间:2022-07-13
下一篇:
C#文本文件打印类库(C#)发布时间:2022-07-13
热门推荐
阅读排行榜

扫描微信二维码

查看手机版网站

随时了解更新最新资讯

139-2527-9053

在线客服(服务时间 9:00~18:00)

在线QQ客服
地址:深圳市南山区西丽大学城创智工业园
电邮:jeky_zhao#qq.com
移动电话:139-2527-9053

Powered by 互联科技 X3.4© 2001-2213 极客世界.|Sitemap