文件IO的方式读取jpeg图片的分辨率

news2024/11/19 1:29:00

1、读取jpeg图片分辨率的两种方式

1.1 使用libjpeg库

可以使用libjpeg库读取JPEG图像文件,并获取图像的分辨率(宽度和高度),简单demo示例如下:

#include <stdio.h>
#include <jpeglib.h>

int main() {
    struct jpeg_decompress_struct cinfo;
    struct jpeg_error_mgr jerr;
    FILE *infile;
    
    if ((infile = fopen("input.jpg", "rb")) == NULL) {
        fprintf(stderr, "Can't open input file\n");
        return 1;
    }

    cinfo.err = jpeg_std_error(&jerr);
    jpeg_create_decompress(&cinfo);
    jpeg_stdio_src(&cinfo, infile);
    jpeg_read_header(&cinfo, TRUE);

    printf("JPEG Image Resolution:\n");
    printf("Width: %d pixels\n", cinfo.image_width);
    printf("Height: %d pixels\n", cinfo.image_height);

    jpeg_destroy_decompress(&cinfo);
    fclose(infile);

    return 0;
}

1.2 使用文件IO的方式

1.2.1 JPEG文件格式


JPEG图片格式组成部分:SOI(文件头)+APP0(图像识别信息)+[APPn(0xFFEn)]可选+ DQT(定义量化表)+SOF0(图像基本信息)+ DHT(定义Huffman表) + DRI(定义重新开始间隔)+ SOS(扫描行开始)+ EOI(文件尾)

其中粗体部分是必须的,下面我就来解释一下这些信息吧。

JPEG的文件分为若干个块,以FF开头,如下图所示

第一列是标记符,第二列十六进制数据,第三列含义

读取JPEG图像的分辨率而不使用libjpeg库,您可以手动解析JPEG文件格式。JPEG文件的结构是复杂的,包含了很多标记和段,其中包含了图像的信息,包括分辨率。JPEG文件中包含了SOF0(Start of Frame)标记,它是一种用于描述图像参数的标记。在JPEG文件的数据流中,SOF0标记通常用来指示图像的基本参数,包括图像的宽度、高度、颜色空间等信息。SOF0标记的格式如下:

- 第一个字节:标记的固定部分,通常为0xFF

- 第二个字节:标记类型,SOF0的类型为0xC0

- 第三、四个字节:标记长度,指示了接下来的数据长度

- 第五个字节:精度,通常为8位

- 第六、七个字节:图像高度

- 第八、九个字节:图像宽度

下面是一个简化的C语言程序,用于读取JPEG图像文件的分辨率:

1.2.1 demo代码实现

#include <stdio.h>

int main() {
    FILE *file;
    char filename[] = "input.jpg";
    unsigned char buffer[2];
    int width, height;

    file = fopen(filename, "rb");

    if (file == NULL) {
        printf("Error opening file\n");
        return 1;
    }

    // 找到图像宽度和高度的段
    while (fread(buffer, sizeof(buffer), 1, file)) {
        if (buffer[0] == 0xFF && buffer[1] == 0xC0) {
            fseek(file, 3, SEEK_CUR);
            fread(buffer, sizeof(buffer), 1, file);
            height = buffer[0] * 256 + buffer[1];
            fread(buffer, sizeof(buffer), 1, file);
            width = buffer[0] * 256 + buffer[1];
            break;
        } else {
            fseek(file, -1, SEEK_CUR);
        }
    }

    printf("JPEG Image Resolution:\n");
    printf("Width: %d pixels\n", width);
    printf("Height: %d pixels\n");

    fclose(file);

    return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1547929.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

6、ChatGLM3-6B 部署实践

一、ChatGLM3-6B介绍与快速入门 ChatGLM3 是智谱AI和清华大学 KEG 实验室在2023年10月27日联合发布的新一代对话预训练模型。ChatGLM3-6B 是 ChatGLM3 系列中的开源模型&#xff0c;免费下载&#xff0c;免费的商业化使用。 该模型在保留了前两代模型对话流畅、部署门槛低等众多…

GPT2从放弃到入门(四)

引言 体验地址&#xff1a;https://huggingface.co/spaces/greyfoss/gpt2-chatbot 上篇文章我们通过Gradio作为前端轻松地连接到训练好的Chatbot&#xff0c;本文介绍如何分享你创建好的模型给你的朋友。 当你训练好的模型推送到Huggingface Hub上后&#xff0c;其实还可以进一…

How to convert .py to .ipynb in Ubuntu 22.04

How to convert .py to .ipynb in Ubuntu 22.04 jupyter nbconvertp2j 最近看到大家在用jupyter notebook&#xff0c;我也试了一下&#xff0c;感觉还不错&#xff0c;不过&#xff0c;也遇到了一些问题&#xff0c;比方说&#xff0c;我有堆的.py文件&#xff0c;如果要一个一…

YOLOv8融入低照度图像增强算法---传统算法篇

YOLOv8n原图检测YOLOv8n增强后检测召回率和置信度都有提升 前言 这篇博客讲讲低照度,大家都催我出一些内容,没想到这么多同学搞这个,恰好我也做过这方面的一些工作,那今天就来讲解一些方法,低照度的图像增强大体分“传统算法”和“深度学习算法”; 目前低照度的图像增…

sqlite3嵌入式开发板命令行方式使用

如何在编译嵌入式版本的sqlite3&#xff0c;请看我上一篇文章 sqlite3 交叉编译-CSDN博客 一、sqlite3命令行方式使用 假如我将编译好的嵌入式的sqlite3放置在如下路径&#xff1a; 进入bin目录进行操作 1.运行sqlite3 运行sqlite3有两种方式 1&#xff09;直接在内存里面…

Wireshark使用相关

1.wireshark如何查看RST包 tcp.flags.reset1 RST表示复位&#xff0c;用来异常的关闭连接&#xff0c;在TCP的设计中它是不可或缺的。发送RST包关闭连接时&#xff0c;不必等缓冲区的包都发出去&#xff08;不像上面的FIN包&#xff09;&#xff0c;直接就丢弃缓存区的包发送R…

Fastgpt 无法启动或启动后无法正常使用的讨论(启动失败、用户未注册等问题这里)

FastGPT 是一个基于 LLM 大语言模型的知识库问答系统&#xff0c;提供开箱即用的数据处理、模型调用等能力。同时可以通过 Flow 可视化进行工作流编排&#xff0c;从而实现复杂的问答场景&#xff01; FastGPT是非常实用并且相当厉害的个人知识库AI项目&#xff0c;项目是非常…

【Ubuntu】文件和目录的增、删、改、查操作

这里写目录标题 (一)文件和目录类命令的使用1、目录与文件的增加&#xff08;1&#xff09;目录的增加 :&#xff08;2&#xff09;文件的增加 2、目录与文件的删除&#xff08;1&#xff09;目录和文件的删除 3、目录与文件的修改&#xff08;1&#xff09;mv命令 4、目录与文…

数字孪生在教学培训的应用场景

数字孪生技术在教学培训领域的应用场景非常广泛&#xff0c;它通过创建一个真实世界的虚拟副本&#xff0c;为教育和培训提供了全新的方法和手段。以下是一些具体的应用场景&#xff0c;希望对大家有所帮助。北京木奇移动技术有限公司&#xff0c;专业的软件外包开发公司&#…

景顺长城:《重塑与创造——2024 ai+洞察报告》

近期&#xff0c;景顺长城发布了《重塑与创造——2024 ai洞察报告》,报告深入探讨了人工智能&#xff08;AI&#xff09;产业的发展现状、未来趋势以及对各行业的潜在影响。报告认为&#xff0c;AI产业发展是多层次、多浪潮的&#xff0c;目前我们处于第二阶段但未来将持续伴随…

Kibana的安装(Linux版)

Kibana是一个针对Elasticsearch的开源分析及可视化平台&#xff0c;用来搜索、查看交互存储在Elasticsearch索引中的数据。使用Kibana&#xff0c;可以通过各种图表进行高级数据分析及展示。 Kibana让海量数据更容易理解。它操作简单&#xff0c;基于浏览器的用户界面可以快速创…

3-iperf3 使用什么工具可以检测网络带宽、延迟和数据包丢失率等网络性能参数呢?

(1)iperf3简介 1.iperf3简介 2.用途&#xff08;特点&#xff09; 3.下载iperf3地址 &#xff08;2&#xff09;实战 1.iperf3参数 &#xff08;1&#xff09;通用参数&#xff08;客户端和服务器端都是适用的&#xff09; &#xff08;2&#xff09;客户端参数 实验1&…

鸿蒙生态专访——对话华为HDE坚果

hi, 大家好, 我是徐小夕. 之前在趣谈前端和大家分享了很多前端工程化, 可视化和低代码的技术实践, 今天又到了《小夕朋友圈》专访时刻, 我会定期采访国内外优秀的开源作者, 独立开发者和创业者, 分享他们的学习成长经验和独立产品开发经验, 让更多热爱技术的小伙伴建立技术自信…

机器学习笔记(3)—多变量线性回归

多变量线性回归&#xff08;LinearRegression witMultiple Variables&#xff09; 前言多变量线性回归多维特征多变量梯度下降特征和多项式回归正规方程 Normal Equation正规方程及不可逆性&#xff08;选&#xff09; 代码实例and计算梯度下降法的一些实例 总结 前言 我们在前…

【C语言】预处理编译链接调试技巧详解

主页&#xff1a;醋溜马桶圈-CSDN博客 专栏&#xff1a;C语言_醋溜马桶圈的博客-CSDN博客 gitee&#xff1a;mnxcc (mnxcc) - Gitee.com 目录 1.预处理 1.1 预定义符号 1.2 #define 1.2.1 #define 定义标识符 1.2.2 #define 定义宏 1.2.3 #define 替换规则 1.2.4 #和## …

cleanmymac x试用期结束会扣费吗?

CleanMyMac X试用期结束后&#xff0c;如果您选择继续使用该应用程序&#xff0c;则需要购买许可证&#xff0c;否则可能会被扣费。为了避免不必要的扣费&#xff0c;建议您在试用期结束前做出决定&#xff0c;如果不打算继续使用&#xff0c;请及时删除该应用程序。 CleanMyMa…

前端html常用标签 笔记

一、基础 开始标签 结束标签 大部分是成对出现的标签&#xff0c;这个是空标签(/放在最后&#xff0c;/可以省掉) 缩进 向后Tab 、前向ShiftTab 红的就是元素属性 标签可以使内容有一些特殊的表现: 给body颜色后&#xff1a; h1 span(连起来) 标签&#xff1a; 标题h1 h2 h3 …

edga 0x800704cf错误码(同步失败)

edga 0x800704cf错误码(同步失败) 执行此操作需要 Internet。 你似乎没有连接到 Internet。请检查你的连接&#xff0c;然后再试一次。 0x800704cf 发送反馈 取消windows键R&#xff0c; 输入services.msc 进入本地服务管理&#xff0c; 重启 Microsoft Account Sign-in Assi…

力扣爆刷第105天之CodeTop100五连刷11-15

力扣爆刷第105天之CodeTop100五连刷11-15 文章目录 力扣爆刷第105天之CodeTop100五连刷11-15一、5. 最长回文子串二、33. 搜索旋转排序数组三、102. 二叉树的层序遍历四、200. 岛屿数量五、121. 买卖股票的最佳时机 一、5. 最长回文子串 题目链接&#xff1a;https://leetcode…

设计模式-装饰者模式在Java中使用实例-打印发票装饰抬头和脚注

场景 设计模式-装饰者模式在Java中的使用示例&#xff1a; 设计模式-装饰者模式在Java中的使用示例_java装饰者模式例子-CSDN博客 上面装饰器的调用示例如下 AbstarctComputer computer;//要买1台电脑computer new BaseComputer();//加一个内存条computer new MemoryDecor…