C语言读取BMP文件信息并在CMD窗口显示图片_cmd显示图片

img
img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上物联网嵌入式知识点,真正体系化!

由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、电子书籍、讲解视频,并且后续会持续更新

需要这些体系化资料的朋友,可以加我V获取:vip1024c (备注嵌入式)

如果你需要这些资料,可以戳这里获取

位图的基本格式可以参考其它博客,这里不进行详细说明。该实验可以更加深入地理解位图的文件结构,以及C语言文件操作的方法。并且理解字节对齐的根本含义。

原始图片及文件信息

原始图片可以在网上下载24位颜色的位图,然后用画图工具进行裁剪编辑,为简单起见,我们限定只使用黑白两种颜色,位图的大小建议不要过大,因为CMD窗口无法显示完全。

这里写图片描述
这里写图片描述

效果图


效果图

字节对齐

不使用单字节对齐系统默认四字节对齐。

这里写图片描述

代码及说明

#include <stdio.h> 
#include <stdlib.h> 
#include <malloc.h> 
//单字节对齐
#pragma pack(1)
typedef struct BitmapFileHeader
{
    unsigned char bfType[2];//文件格式
    unsigned long bfSize;//文件大小
    unsigned short bfReserved1;//保留
    unsigned short bfReserved2;//保留
    unsigned long bfOffBits; //图片数据在文件中的偏移量
}fileHeader;
typedef struct BitmapInfoHeader
{
    unsigned long biSize;//该结构的大小
    long biWidth;//文件宽度
    long biHeight;//文件高度
    unsigned short biPlanes;//平面数
    unsigned short biBitCount;//颜色位数
    unsigned long biCompression;//压缩类型
    unsigned long biSizeImage;//DIB数据区大小
    long biXPixPerMeter;
    long biYPixPerMeter;
    unsigned long biClrUsed;//颜色索引表数目
    unsigned long biClrImporant;//重要颜色数目
}fileInfo;

int main(void)
{
    FILE *fpaa;
    if ((fpaa = fopen("aa.bmp", "rb") )== NULL)
    {
        printf("打开文件失败");
        exit(0);
    }
    printf("fpaa偏移量: %d\n", ftell(fpaa));
    fileHeader *fh;
    printf("fileHeader结构体大小: %d字节\n", sizeof(fileHeader));
    //如果不采样单字节对齐,申请内存时相对于aa.bmp就多出两个字节
    fh= (fileHeader *)malloc(sizeof(fileHeader));
    fread(fh, sizeof(fileHeader), 1, fpaa);
    printf("头文件格式: %c%cP\n", fh->bfType[0], fh->bfType[1]);
    printf("头文件大小: %d字节\n", fh->bfSize);
    printf("DIB数据在文件中的偏移量: %d字节\n", fh->bfOffBits);
    printf("fpaa读取头文件后偏移量: %d\n",ftell(fpaa));
    fileInfo * fi;
    fi = (fileInfo *)malloc(sizeof(fileInfo));
    fread(fi, sizeof(fileInfo), 1, fpaa);
    printf("fpaa读取信息文件后偏移量: %d\n", ftell(fpaa));
    printf("位图信息大小: %d\n",fi->biSize);
    printf("文件宽度: %d\n", fi->biWidth);
    printf("文件高度: %d\n", fi->biHeight);
    printf("平面数: %d\n", fi->biPlanes);


**收集整理了一份《2024年最新物联网嵌入式全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升的朋友。**
![img](https://img-blog.csdnimg.cn/img_convert/ab6f42220aee15644c9076842a3af944.png)
![img](https://img-blog.csdnimg.cn/img_convert/c5a694fdc084bf99ee96428de2fed49b.png)

**[如果你需要这些资料,可以戳这里获取](https://bbs.csdn.net/topics/618679757)**

**需要这些体系化资料的朋友,可以加我V获取:vip1024c (备注嵌入式)**

**一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人**

**都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!**

嵌入式)**

**一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人**

**都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!**

  • 5
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 可以使用库函数来实现这个功能。比如说,可以使用libjpeg库中的相关函数来读取并解码JPEG图片。 下面是一个简单的例子,使用了libjpeg库中的jpeg_stdio_src()和jpeg_read_header()函数来读取并解析JPEG图片文件信息: ``` #include <stdio.h> #include <jpeglib.h> int main() { // 声明JPEG文件指针 FILE * infile; // 声明JPEG解码器指针 struct jpeg_decompress_struct cinfo; // 声明JPEG错误信息指针 struct jpeg_error_mgr jerr; // 使用fopen()函数打开JPEG文件 infile = fopen("image.jpg", "rb"); if (infile == NULL) { fprintf(stderr, "Can't open input file image.jpg!\n"); return 1; } // 为JPEG解码器设置错误处理信息 cinfo.err = jpeg_std_error(&jerr); // 初始化JPEG解码器 jpeg_create_decompress(&cinfo); // 设置输入流为文件指针 jpeg_stdio_src(&cinfo, infile); // 读取JPEG文件信息 jpeg_read_header(&cinfo, TRUE); // 关闭文件 fclose(infile); return 0; } ``` 上面的代码只是读取文件信息,如果要读取显示整个图片,还需要使用其他函数来解码图片像素数据。 另外,如果你的系统中没有安装libjpeg库,可以到网上下载并安装。然后在编译时使用 ### 回答2: 要在C语言读取显示jpg图片,可以使用第三方库,如OpenCV。 首先,需要安装OpenCV库并导入相关头文件。然后,使用OpenCV提供的函数加载jpg图片: ```c #include <opencv2/opencv.hpp> int main() { // 加载图片 cv::Mat image = cv::imread("image.jpg"); // 检查图片是否成功加载 if (image.empty()) { printf("图片加载失败\n"); return -1; } // 创建窗口显示图片 cv::namedWindow("JPG Image", cv::WINDOW_NORMAL); cv::imshow("JPG Image", image); // 等待按键 cv::waitKey(0); return 0; } ``` 上述代码中,我们使用`imread`函数加载指定路径的jpg图片,并将加载的图片保存在`image`变量中。然后,使用`namedWindow`函数创建一个窗口,并将其标题设置为"JPG Image"。最后,使用`imshow`函数将加载的图片显示在这个窗口中。`waitKey`函数用于等待按键,这样窗口就能一直保持显示状态,直到用户按下任意键为止。 以上就是使用C语言读取显示jpg图片的简单示例。实际上,OpenCV库提供了更多的图像处理和显示功能,你可以根据需要进行进一步的学习和扩展。 ### 回答3: 在C语言中,我们可以通过使用相关的图像处理库来读取显示jpg图片。一个常用的图像处理库是OpenCV。 首先,我们需要安装并配置OpenCV库。在安装完成后,我们可以使用以下步骤来读取显示jpg图片: 1. 导入OpenCV库: ``` #include <opencv2/opencv.hpp> ``` 2. 定义一个函数来读取显示图片: ``` void readAndDisplayImage(const char* imageName) { // 使用imread函数读取图片 cv::Mat image = cv::imread(imageName); // 检查是否成功读取图片 if (!image.data) { printf("无法读取图片\n"); return; } // 创建一个窗口显示图片 cv::namedWindow("Image", cv::WINDOW_NORMAL); // 调整窗口大小以适应图片尺寸 cv::resizeWindow("Image", image.cols, image.rows); // 在窗口显示图片 cv::imshow("Image", image); // 等待用户按下任意键 cv::waitKey(0); // 销毁窗口 cv::destroyWindow("Image"); } ``` 3. 在主函数中调用该函数并给出图片路径: ``` int main() { const char* imageName = "图片路径.jpg"; readAndDisplayImage(imageName); return 0; } ``` 以上步骤将读取指定路径的jpg图片,并将其显示在一个窗口中。可以根据需要修改窗口的名称和大小。注意要替换图片路径为实际的jpg图片路径。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值