前端js获取图片大小 扩展名_前端 JS 获取 Image 图像 宽高 尺寸

前端 JS 获取 Image 图像 宽高 尺寸

简介

项目中用到获取图片的原始尺寸,然后适配宽高;网上的大部分前端解决方案,都是new Image()后,在onload事件中获取image的尺寸。

在图片数量较多的时候,这样的获取效率实在是低下。所有就有了这篇文章。通过直接读取解析文件的字节码来获取图片的尺寸。

IMAGE_HEAD_SIGS

var IMAGE_HEAD_SIGS = {

GIF: [0x47, 0x49, 0x46], //'G' 'I' 'F' ascii

PNG: [0x89, 0x50, 0x4e, 0x47, 0x0d, 0x0a, 0x1a, 0x0a],

JPG: [0xff, 0xd8, 0xff, 0xe0],

BMP: [0x42, 0x4d]

}

PNG

L3Byb3h5L2h0dHAvaW1hZ2UubWFtaWNvZGUuY29tL2luZm8vMjAxOTExLzIwMTkxMTAyMTIxNzEwNDgwOTgxLmpwZw==.jpg

function ReadPNG(bytes) {

if (bytes.slice(0, 8).toString() === IMAGE_HEAD_SIGS.PNG.toString()) {

let width = readUint32BE(bytes, 16);

let height = readUint32BE(bytes, 20);

return { width, height }

}

}

JPG

L3Byb3h5L2h0dHAvaW1hZ2UubWFtaWNvZGUuY29tL2luZm8vMjAxOTExLzIwMTkxMTAyMTIxNzEwNTMzNzE3LmpwZw==.jpg

function ReadJPG(bytes) {

if (bytes.slice(0, 4).toString() === IMAGE_HEAD_SIGS.JPG.toString()) {

const M_SOF0 = 0xC0; /* Start Of Frame N */

const M_SOF1 = 0xC1; /* N indicates which compression process */

const M_SOF2 = 0xC2; /* Only SOF0-SOF2 are now in common use */

const M_SOF3 = 0xC3;

const M_SOF5 = 0xC5; /* NB: codes C4 and CC are NOT SOF markers */

const M_SOF6 = 0xC6;

const M_SOF7 = 0xC7;

const M_SOF9 = 0xC9;

const M_SOF10 = 0xCA;

const M_SOF11 = 0xCB;

const M_SOF13 = 0xCD;

const M_SOF14 = 0xCE;

const M_SOF15 = 0xCF;

for (let i = 0; i < bytes.length; i++) {

if (bytes[i] === 0xFF) {

switch (bytes[i + 1]) {

case M_SOF0:

case M_SOF1:

case M_SOF2:

case M_SOF3:

case M_SOF5:

case M_SOF6:

case M_SOF7:

case M_SOF9:

case M_SOF10:

case M_SOF11:

case M_SOF13:

case M_SOF14:

case M_SOF15:

{

//高在前,宽在后。

let width = readUint16BE(bytes, i + 7)

let height = readUint16BE(bytes, i + 5)

return { width, height }

}

default:

break;

}

}

}

}

}

GIF

L3Byb3h5L2h0dHAvaW1hZ2UubWFtaWNvZGUuY29tL2luZm8vMjAxOTExLzIwMTkxMTAyMTIxNzEwNTcyNzgxLmpwZw==.jpg

function ReadGIF(bytes) {

if (bytes.slice(0, 3).toString() === IMAGE_HEAD_SIGS.GIF.toString()) {

let width = readUint16LE(bytes, 6);

let height = readUint16LE(bytes, 8);

return { width, height }

}

}

BMP

L3Byb3h5L2h0dHAvaW1hZ2UubWFtaWNvZGUuY29tL2luZm8vMjAxOTExLzIwMTkxMTAyMTIxNzEwNjA5ODkyLmpwZw==.jpg

function ReadBMP(bytes) {

if (bytes.slice(0, 2).toString() === IMAGE_HEAD_SIGS.BMP.toString()) {

//虽然格式为4字节,这里只取2字节,确保height为正数。为负数时,图像为倒置图像。

let height = readUint16LE(bytes, 22);

let width = readUint16LE(bytes, 18);

return { width, height }

}

}

NPM

npm i image-dimensionj

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

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

相关文章

mysql linux 安装_mysql-5.7.28 在Linux下的安装教程图解

2.上传tar包到服务器到 /usr/local/src3.卸载系统自动的Mariadb rpm -qa | grep mariadb rpm -e --nodeps mariadb-libs-5.5.60-1.el7_5.x86_644.检查是否有mysql存在rpm -qa|grep -i mysql5.查询是否还有mysql的目录find / -name mysql6.解压&#xff1a;tar -zxvf7.修改名称&…

有关软件工程的问题的分析和讨论及课后的作业3

个人电脑界面的演变。 1973年四月第一次操作是在施乐PARC Alto计算机完成。 该系统是第一个将现代图形用户界面中的所有元素结合起来的系统。 1981年6月施乐介绍了星&#xff0c;商业阿尔托的继任者。 显著特点&#xff1a;双点击图标&#xff0c;重叠窗口&#xff0c;对话框和…

apache httpd mysql_Centos7安装配置Apache(httpd)+php+mysql+phpMyAdmin

一、安装mysql执行命令&#xff1a;rpm -ivh mysql-community-release-el7-5.noarch.rpm执行 yum -y install mysql mysql-server mysql-devel&#xff0c;安装成功。再次使用该命令&#xff0c;然后得到以下信息打开mysql服务 &#xff1a;service mysqld start进入mysql客户端…

如何:创建公钥/私钥对

要使用强名称为程序集签名&#xff0c;必须具有公钥/私钥对。 这一对加密公钥和加密私钥用于在编译过程中创建强名称程序集。 您可以使用强名称工具 (Sn.exe) 来创建密钥对。 密钥对文件通常具有 .snk 扩展名。 注意 在 Visual Studio 中&#xff0c;C# 和 Visual Basic 项…

用户设置及用户默认设置

1、创建 其中&#xff0c;Root.plist中为设置 2、读取应用中的设置 3、在应用中修改默认设置 4、注册默认值 5、保证设置有效&#xff08;我们注册所有控制器&#xff0c;以便接收从暂停执行状态唤醒的应用发送出来的通知&#xff09; 每个控制器都订阅我们关注的通知。 6、撤销…

activemq jdbc mysql_activeMQ JDBC Master Slave

ActiveMQ集群应用2\ ActiveMQ JDBC 主从集群3\ 解决单点故障&#xff1a;JDBC Master Slave本人应用的为集群方案中的一种&#xff0c; JDBC Master Slave &#xff0c;说明及好处就看如上外链文章了&#xff0c;上正题&#xff0c;方案如何实施及程序如何调用&#xff11;&…

orcale 基本查询(1)

orcale 基本查询      查询当前用户下的所有表&#xff1a;     select * from tab;      查询表结构&#xff1a;   desc 表名设置行宽&#xff1a;    set linesize 120;设置列宽&#xff1a;    数值类型&#xff1a;      col 列名 for…

优秀的Android资源

今天&#xff0c;收藏了一下“优秀的Android资源”&#xff0c;以后有时间也学习学习。 一、开发工具 开发android第一步就是安装开发工具SDK&#xff0c;国内有一些机构和公司对些作了境像&#xff0c;这个网站作了详细统计列表&#xff1a;http://www.androiddevtools.cn/&am…

监控mysql业务数据分析_MySQL数据库监控指标之执行性能总结

查询性能MySQL 用户监控查询延迟的方式有很多&#xff0c;既可以通过 MySQL 内置的指标&#xff0c;也可以通过查询性能模式。从 MySQL 5.6.6 版本开始默认启用&#xff0c;MySQL 的 performance_schema 数据库中的表格存储着服务器事件与查询执行的低水平统计数据。1、perform…

redis集群关闭 启动报错_使用虚拟机搭建 Redis 集群,实现数据库的负载均衡功能。...

实操题目:使用虚拟机搭建 Redis 集群&#xff0c;实现数据库的负载均衡功能。并使用图文描述整个过程。先创建集群:①创建集群需要使用ruby脚本,所以要先安装ruby环境 安装ruby环境:yum install ruby 安装ruby的包管理器:yum install rubygems②进入到redis的安装目录下的 src …

[转]完美解决IE(IE6/IE7/IE8)不兼容HTML5标签的方法

HTML5的语义化标签以及属性&#xff0c;可以让开发者非常方便地实现清晰的web页面布局&#xff0c;加上CSS3的效果渲染&#xff0c;快速建立丰富灵活的web页面显得非常简单。 HTML5的新标签元素有&#xff1a; <header> 定义页面或区段的头部&#xff1b; <footer&…

mysql change index_MySQL · 引擎特性 · Innodb change buffer介绍

前言在前面几期月报我们介绍了undo log、redo log以及InnoDB如何崩溃恢复来实现数据ACID的相关知识。本期我们介绍另外一种重要的数据变更日志&#xff0c;也就是InnoDB change buffer。 Change buffer的主要目的是将对二级索引的数据操作缓存下来&#xff0c;以此减少二级索引…

dncnn图像去噪_一种基于DnCNNs改进的图像降噪方法与流程

本发明涉及图像处理技术领域&#xff0c;具体涉及一种基于dncnns改进的图像降噪方法。背景技术&#xff1a;随着科技进步&#xff0c;新的图像技术在逐渐推广&#xff0c;在日常生活中人们对于图像的要求也越来越高&#xff0c;针对阴天或夜晚等弱光条件下拍摄的图像具有噪点较…

Linux 挂载命令 --mount

1.挂载光盘命令 mount : mount [-t vfstype] [-o options] device dir mount [-t 文件系统] [-o 特殊选项] 设备文件名 挂载点 -t 指定挂载的文件系统类型&#xff0c;ext3,ext4,iso9660(光盘的文件类型)f等类型 -o 指定额外的挂载选项 卸载光盘命令 umount 设备文件名或挂…

ios view添加上边框_iOS开发之如何给View添加指定位置的边框线详解

本文主要给大家介绍了关于iOS如何给View添加指定位置边框线的相关内容&#xff0c;分享出来供大家参考学习&#xff0c;下面话不多说了&#xff0c;来一起看看详细的介绍吧。略微封装了一下&#xff0c;给View添加指定位置的边框线&#xff0c;其中位移枚举的使用询问了哥们儿&…

python绘画音频_人工智能下的音频还能这样玩!!!!

人工智能音频处理库—librosa(安装与使用)序言一、libsora安装pypicondasource二、librosa常用功能核心音频处理函数音频处理频谱表示幅度转换时频转换特征提取绘图显示三、常用功能代码实现读取音频提取特征提取Log-Mel Spectrogram 特征提取MFCC特征绘图显示绘制声音波形绘制…

保存到数据库乱码mysql_Linux下MySQL保存进去数据为乱码的解决办法

MySQL默认的字符编码是latin1,而我用的是utf-8,存入数据库就变成了?????这样的乱码&#xff0c;解决方法&#xff1a;1、windows下:修改my.ini文件&#xff0c;有两处default-character-setlatin1都改为default-character-setutf8重启既可。2、linux下&#xff1a;vi /etc…

网页版四则运算(未全部完成)

这次作业一直在做&#xff0c;一直在拖着&#xff0c;总感觉心里亏欠点什么&#xff0c;但是人就是这样&#xff0c;一件事情本来做起来就没有太多成功的几率&#xff0c;就想着延长工期&#xff0c;那就一直拖着吧&#xff0c;拖得时间越久你就会越发清晰地意识到自己已经非常…

一个DataGridView辅助类

DataGridView是在用C#做windows界面程序时常用到的控件,DataGridView的功能非常多,用起来也非常复杂 例如1. 我想在每行前面显示行编号,则需要先设置RowHeadersVisible为true,然后,在添加RowPostPaint事件,而RowPostPaint写起来也大同小异,这就非常没有必要.期望一个DataGridVi…

java 压缩文件夹_java 实现压缩文件(单文件 或 文件夹)

接着上篇了解一下java压缩实现过程&#xff0c;下面的是支持 单文件 或 文件夹 压缩的实现&#xff0c;使用递归。效果&#xff1a;代码&#xff1a;package com.gx.compress;import java.io.BufferedInputStream;import java.io.BufferedOutputStream;import java.io.File;imp…