解析图片文件格式

news2024/10/6 22:25:36

图片文件幻数

在这里插入图片描述

关于JPEG格式

二进制形式打开文件,文件开始字节为FF D8,文件结束两字节为FF D9
JPEG 文件有两种不同的元数据格式:JFIF 和 EXIF。
JFIF 以 ff d8 ff e0 开头,EXIF 以 ff d8 ff e1 开头。

代码示例

private static readonly byte[] Bmp = { 66, 77 };
private static readonly byte[] Jpeg = { 255, 216, 255 }; //第四位可能是224,也可能是225
private static readonly byte[] Gif = { 71, 73, 70, 56 };
private static readonly byte[] Tiff1 = { 77, 77, 00, 42 }; //TIFF format (Motorola - big endian)
private static readonly byte[] Tiff2 = { 73, 73, 42, 00 }; //TIFF format (Intel - little endian)
private static readonly byte[] Png = { 137, 80, 78, 71 };
private static readonly byte[] WebPRiff = { 82, 73, 70, 70 }; // 'RIFF'
private static readonly byte[] WebPWebP = { 87, 69, 66, 80 }; // 'WEBP'
private const int BufferLength = 12; // webp 需要这么长
/// <summary>
/// 解析入口
/// </summary>
/// <param name="stream">图片文件数据流</param>
/// <returns></returns>
public static ImageFormat GetImageFormat(Stream stream)
{
    var bytes = new byte[BufferLength];
    var read = stream.Read(bytes, 0, bytes.Length);
    return read < BufferLength ? ImageFormat.Unknown : GetImageFormat(bytes);
}

/// <summary>
/// 获取文件格式类型
/// </summary>
/// <param name="bytes"></param>
/// <returns></returns>
public static ImageFormat GetImageFormat(byte[] bytes)
{
    if (bytes.Length < BufferLength)
        return ImageFormat.Unknown;

    if (bytes.Take(Bmp.Length).SequenceEqual(Bmp))
        return ImageFormat.Bmp;
    if (bytes.Take(Jpeg.Length).SequenceEqual(Jpeg))
        return ImageFormat.Jpeg;
    if (bytes.Take(Gif.Length).SequenceEqual(Gif))
        return ImageFormat.Gif;
    if (bytes.Take(Tiff1.Length).SequenceEqual(Tiff1)
        || bytes.Take(Tiff2.Length).SequenceEqual(Tiff2))
        return ImageFormat.Tiff;
    if (bytes.Take(Png.Length).SequenceEqual(Png))
        return ImageFormat.Png;
    if (bytes.Take(WebPRiff.Length).SequenceEqual(WebPRiff)
        && bytes.Skip(8).Take(WebPWebP.Length).SequenceEqual(WebPWebP))
        return ImageFormat.WebP;

    return ImageFormat.Unknown;
}

源码传送门

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

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

相关文章

Visual Studio自定义模板参数、备注

模板路径&#xff1a; VS2022 x64&#xff1a;C:\Program Files\Microsoft Visual Studio\2022\Enterprise\Common7\IDE\ItemTemplatesVS2022 x86&#xff1a;C:\Program Files (x86)\Microsoft Visual Studio\2022\Enterprise\Common7\IDE\ItemTemplates 一、声明和启用模板…

六、循环表达式

6.1 循环表达式语法 thymeleaf使用th:each属性可以对数组&#xff0c;集合进行循环&#xff0c;此属性用在容器元素上&#xff0c;循环生成子元素。 语法 th:each"循环出的元素 , 循环状态 : 集合或数组" .6.2、数组的循环 示例 在TestServlet中定义一个数组 …

Vue中如何进行自定义动画与动画效果设计(如CSS动画、Web动画)

当我们构建现代的Web应用程序时&#xff0c;动画和过渡效果变得越来越重要。它们可以增强用户体验&#xff0c;使用户界面更具吸引力&#xff0c;并帮助用户更好地理解应用程序的功能。Vue.js是一个流行的JavaScript框架&#xff0c;它提供了许多强大的工具和功能&#xff0c;使…

大数据技术标准推进委员会发布《地球大数据白皮书(2023年)》

导读 地球大数据的应用领域范围广阔&#xff0c;包括生态保护、自然资源管理、气象服务、城市规划、应急容灾等方面&#xff0c;但目前仍处于发展初期&#xff0c;面临着数据来源、结构多样&#xff0c;数据管理门槛高&#xff0c;数据应用场景复杂、落地方法论较少等痛点。如…

Linux系统常用指令篇---(三)

Linux系统常用指令篇—(三) 1.tree指令 ​ tree这条指令需要安装,不是自带就有的. 安装指令:yum -y install tree作用: ​ 以树状图的形式展开目录 2.which指令 which命令用于查找文件 指令在本质上就是可执行程序,因此也属于文件 3.cp指令 语法&#xff1a; cp [选项] …

【力扣每日一题】2023.10.7 股票价格跨度

目录 题目&#xff1a; 示例&#xff1a; 分析&#xff1a; 代码&#xff1a; 题目&#xff1a; 示例&#xff1a; 分析&#xff1a; 给我们一个数组表示不同时间的股票的价格&#xff0c;要我们按照顺序返回每天的股票价格跨度&#xff0c;价格跨度就是股票价格小于或等于…

如何批量获取京东商品详情数据,京东商品详情API接口

批量获取京东商品详情数据可以通过京东开放平台接口来实现。 首先&#xff0c;您需要在京东开放平台注册成为开发者并创建一个应用&#xff0c;获取到所需的App Key和App Secret等信息。然后&#xff0c;使用获取到的App Key和App Secret进行签名和认证&#xff0c;获取Access…

前后端分离计算机毕设项目之基于SpringBoot的旅游网站的设计与实现《内含源码+文档+部署教程》

博主介绍&#xff1a;✌全网粉丝10W,前互联网大厂软件研发、集结硕博英豪成立工作室。专注于计算机相关专业毕业设计项目实战6年之久&#xff0c;选择我们就是选择放心、选择安心毕业✌ &#x1f345;由于篇幅限制&#xff0c;想要获取完整文章或者源码&#xff0c;或者代做&am…

基于SSM+Vue的订餐系统设计与实现

末尾获取源码 开发语言&#xff1a;Java Java开发工具&#xff1a;JDK1.8 后端框架&#xff1a;SSM 前端&#xff1a;采用Vue技术开发 数据库&#xff1a;MySQL5.7和Navicat管理工具结合 服务器&#xff1a;Tomcat8.5 开发软件&#xff1a;IDEA / Eclipse 是否Maven项目&#x…

每日一题 2034. 股票价格波动(中等,有序队列)

思路&#xff1a; 对于最高和最低价格&#xff0c;维护一个有序的存储所有价格的队列即可实现当执行 update 时&#xff0c;将队列中原来的 price 删除&#xff08;如果有的话&#xff0c;且耗时O(logn)&#xff09;&#xff0c;然后再插入新的 price 并保持有序&#xff08;耗…

Elasticsearch:语义搜索快速入门

这个交互式 jupyter notebook 将使用官方 Elasticsearch Python 客户端向你介绍 Elasticsearch 的一些基本操作。 你将使用 Sentence Transformers 进行文本嵌入的语义搜索。 了解如何将传统的基于文本的搜索与语义搜索集成&#xff0c;形成混合搜索系统。在本示例中&#xff0…

漏刻有时数据可视化大屏(15)智慧党建大数据平台

智慧党建大数据平台是依托现代信息技术和“互联网党建”的大数据管理模式&#xff0c;建立的综合党建平台。该平台集组织管理、党务中心、学习考评、宣传阵地、统计分析、党建助手、我的工作台等主要功能于一体&#xff0c;实现了基层党建工作数据化、在线化、可视化。以下是智…

使用弹性盒子flex对html进行布局和动态计算视口高度

使用弹性盒子flex对html进行布局的一个练习 height: calc(100vh - 4px); # vh表示视口高度的百分比&#xff0c;所以100vh表示整个视口的高度。 .mytxt { text-indent: 2em; /* 首航缩进2字符 */ line-height: 2; /* 2倍行高 */ padding: 8px; /* 内容与边框的距离 */ } …

MQ - 37 云原生:MQ的分层存储架构的实现方案

文章目录 导图概述什么是分层存储分层存储的应用和局限实现分层存储的技术思考选择远程文件系统生产性能优化消费性能优化方案一方案二隔离性和回滚隔离性回滚业界主流消息队列的架构分析RocektMQ 多级存储的实现分析Kakfa 分层存储的实现分析为什么 RocketMQ 使用准实时的方式…

Transformer预测 | Pytorch实现基于Transformer 的锂电池寿命预测(CALCE数据集)

文章目录 效果一览文章概述模型描述程序设计参考资料效果一览 文章概述 Pytorch实现基于Transformer 的锂电池寿命预测,环境为pytorch 1.8.0,pandas 0.24.2 随着充放电次数的增加,锂电池的性能逐渐下降。电池的性能可以用容量来表示,故寿命预测 (RUL) 可以定义如下: SOH(t…

【银河麒麟V10】【服务器】Oracle11g部署

一、环境准备 操作系统版本&#xff1a;银河麒麟V10 SP1 0518 Server x86_64 二、基础环境准备 1、安装麒麟操作系统 注意&#xff1a;预留至少7G以上swap缓存 2、关闭selinux和firewalld 3、如果是内网环境需要挂载本地源 【银河麒麟V10】【服务器】搭建本地镜像源_桂安俊…

【Linux】Vim使用总结

【Linux】Vim使用总结 Vim 的三种模式命令行模式1. 移动2.复制&#xff0c;粘贴&#xff0c;剪切3.撤销4.大小写切换&#xff0c;替换&#xff0c;删除 插入模式底行模式 Vim 的三种模式 一进入VIM就是处于一般模式&#xff08;命令模式&#xff09;&#xff0c;该模式下只能输…

java BigInteger的基本使用

BigInteger 注意对象一旦创建,内部记录的值不能发生改变 import java.math.BigInteger; import java.util.Random;public class myBigInteger {public static void main(String[] args) {//获取一个随机的大整数BigInteger bigIntegernew BigInteger(4,new Random());System.ou…

3dmax怎样渲染全景图?3dmax渲染全景图的2种方法

3dmax怎样渲染全景图&#xff1f;今天介绍3dmax渲染全景图的3种方法 3dmax渲染全景图方法1 在 360 度渲染时&#xff0c;您必须采取的第一步是放置摄像机。 定位相机&#xff1a;选择您要使用的相机类型。 无论您希望使用哪种类型的相机&#xff08;目标相机、物理相机或免费…

漏刻有时数据可视化Echarts组件开发(42)炫酷的pictorialBar象形柱图代码分析

核心代码 var data []; for (let i 0; i < 5; i) {data.push(Math.round(Math.random() * 10)); } var xData2 ["A", "B", "C", "D", "E"]; var data1 [100, 100, 100, 100, 100]; // var data2 [50, 32, 55, 65, …