java快速获取大图片的分辨率(大图片格式JPG,tiff ,eg)
问题描述:怎样快速获取一个20MB图片的分辨率?
程序代码:
package test; import java.awt.Dimension;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import java.util.Iterator;
import javax.imageio.ImageIO;
import javax.imageio.ImageReader;
import javax.imageio.stream.FileImageInputStream;
import javax.imageio.stream.ImageInputStream; /**
* 读取大图片的分辨率
*
* @author 远方bruce
*
*/
public class ReadResolution {
/**
* 通过BufferedImage获取
* @param file 文件
* @return 图片的分辨率
* @throws IOException
*/
public static String getResolution1(File file) throws IOException {
BufferedImage image = ImageIO.read(file);
return image.getWidth() + "x" + image.getHeight();
} /**
* 获取图片的分辨率
*
* @param path
* @return
*/
public static Dimension getImageDim(String path) {
Dimension result = null;
String suffix = getFileSuffix(path);
//解码具有给定后缀的文件
Iterator<ImageReader> iter = ImageIO.getImageReadersBySuffix(suffix);
System.out.println(ImageIO.getImageReadersBySuffix(suffix));
if (iter.hasNext()) {
ImageReader reader = iter.next();
try {
ImageInputStream stream = new FileImageInputStream(new File(
path));
reader.setInput(stream);
int width = reader.getWidth(reader.getMinIndex());
int height = reader.getHeight(reader.getMinIndex());
result = new Dimension(width, height);
} catch (IOException e) {
e.printStackTrace();
} finally {
reader.dispose();
}
}
System.out.println("getImageDim:" + result);
return result;
} /**
* 获得图片的后缀名
* @param path
* @return
*/
private static String getFileSuffix(final String path) {
String result = null;
if (path != null) {
result = "";
if (path.lastIndexOf('.') != -1) {
result = path.substring(path.lastIndexOf('.'));
if (result.startsWith(".")) {
result = result.substring(1);
}
}
}
System.out.println("getFileSuffix:" + result);
return result;
} /**
* 截取Dimension对象获得分辨率
* @param path
*
* @return
*/
public static String getResolution2(String path) {
String s = getImageDim(path).toString();
s = s.substring(s.indexOf("[") + 1, s.indexOf("]"));
String w = s.substring(s.indexOf("=") + 1, s.indexOf(","));
String h = s.substring(s.lastIndexOf("=") + 1);
String result = w + " x " + h;
System.out.println("getResolution:" + result);
return result;
} /**
* 测试
*
* @param args
* @throws IOException
*/
public static void main(String[] args) throws IOException {
String path = "d:\\abc.JPG";
File file = new File(path);
System.out.println("第1种方法使用的时间:");
long s1 = System.currentTimeMillis();
System.out.println(getResolution1(file));
long l1 = System.currentTimeMillis();
System.out.println((l1 - s1)+"ms");
System.out.println("******************************");
System.out.println("第2种方法使用的时间:");
long s2 = System.currentTimeMillis();
getResolution2(path);
long l2 = System.currentTimeMillis();
System.out.println((l2 - s2)+"ms");
}
}
运行结果:
第1种方法使用的时间:
11935x8554
4867ms
******************************
第2种方法使用的时间:
getFileSuffix:JPG
javax.imageio.ImageIO$ImageReaderIterator@11ddcde
getImageDim:java.awt.Dimension[width=11935,height=8554]
getResolution:11935 x 8554
0ms
注意:由于第一种方法是将图片一次性读入内存所以需要设置JVM的运行内存,具体方法是run图标下拉-》Run Configurations-》VM arguments填入
-Xms256m -Xmx1024m
解释:Dimension类封装单个对象中组件的宽度和高度(精确到整数)。ImageIO类包含一些用来查找 ImageReader 和 ImageWriter
以及执行简单编码和解码的静态便捷方法。ImageReader用来解析和解码图像的抽象超类。
java快速获取大图片的分辨率(大图片格式JPG,tiff ,eg)的更多相关文章
- [Selenium] Java代码获取,设置屏幕分辨率
import java.awt.Dimension; import java.awt.DisplayMode; import java.awt.GraphicsDevice; import java. ...
- Android Camera开发系列(上)——Camera的基本调用与实现拍照功能以及获取拍照图片加载大图片
Android Camera开发系列(上)--Camera的基本调用与实现拍照功能以及获取拍照图片加载大图片 最近也是在搞个破相机,兼容性那叫一个不忍直视啊,于是自己翻阅了一些基本的资料,自己实现了一 ...
- Java快速读取大文件
Java快速读取大文件 最近公司服务器监控系统需要做一个东西来分析Java应用程序的日志. 第一步探索: 首先我想到的是使用RandomAccessFile,因为他可以很方便的去获取和设置文件指针,下 ...
- JS快速获取图片宽高的方法
快速获取图片的宽高其实是为了预先做好排版样式布局做准备,通过快速获取图片宽高的方法比onload方法要节省很多时间,甚至一分钟以上都有可能,并且这种方法适用主流浏览器包括IE低版本浏览器. 我们一步一 ...
- 图片流量节省大杀器:基于CDN的sharpP自适应图片技术实践
版权声明:本文由陈忱原创文章,转载请注明出处: 文章原文链接:https://www.qcloud.com/community/article/156 来源:腾云阁 https://www.qclou ...
- 转载:JS快速获取图片宽高的方法
快速获取图片的宽高其实是为了预先做好排版样式布局做准备,通过快速获取图片宽高的方法比onload方法要节省很多时间,甚至一分钟以上都有可能,并且这种方法适用主流浏览器包括IE低版本浏览器. 我们一步一 ...
- 图片流量节省大杀器:基于腾讯云CDN的sharpP自适应图片技术实践
目前移动端运营素材大部分依赖图片,基于对图片流量更少,渲染速度更快的诉求,我们推动CDN,X5内核,即通产品部共同推出了一套业务透明,无痛接入的CDN图片优化方案:基于CDN的sharpP自适应图片无 ...
- JAVA开发搞了一年多的大数据,究竟干了点啥
JAVA开发搞了一年多大数据的总结 2021年7月份加入了当前项目组,以一个原汁原味的Java开发工程师的身份进来的,来了没多久,项目组唯一一名大数据开发工程师要离职了,一时间一大堆的数据需求急需 ...
- java环境中基于jvm的两大语言:scala,groovy
一.java环境中基于jvm的两大语言:scala,groovy 可以在java项目里混编这两种语言: scala:静态语言,多范式语言,糅合了面向对象.面向过程:可以与java和net互操作:融汇了 ...
随机推荐
- iOS 状态栏管理
iOS 7 以前:状态栏由 UIApplication 管理 1.隐藏状态栏 : application.statusBarHidden = NO; 2.设置状态栏样式 : application.s ...
- Netty4.x中文教程系列(一) Hello World !
1.下载并为项目添加Netty框架 1. Netty的包大家可以从Netty官网:http://netty.io/downloads.html 下载 如图所示: Netty提供了四个个主要版本的框架包 ...
- 使用Redis构建简单的ORM
Reids相关的资料引用 http://www.tuicool.com/articles/bURJRj [Reids各种数据类型的应用场景] https://github.com/antirez/re ...
- Error building Player: CommandInvokationFailure: Failed to re-package resources. See the Console for details. ShareSDK 也有这种错误
Error building Player: CommandInvokationFailure: Failed to re-package resources. See the Console for ...
- python datetime笔记
python datetime笔记 http://mint-green.diandian.com/post/2011-09-09/4892024 获取当前时间,并通过字符串输出. 格式为:%Y-%m- ...
- 利用VS2005进行dump文件调试
前言:利用drwtsn32或NTSD进行程序崩溃处理,都可以生成可用于调试的dmp格式文件.使用VS2005打开生成的DMP文件,能很方便的找出BUG所在位置.本文将讨论以下内容: 1. 程序编译选 ...
- linux crontab任务调度的使用
(不推荐)可以直接将要调度的任务写入crontab任务表中 (推 荐)可以先将要完成的任务写入一个shell文件,如myTask.sh(还可能需要将该文件改为可执行的:chmod 744 myTa ...
- Mysql一主多从和读写分离配置简记
近期开发的系统中使用MySQL作为数据库,由于数据涉及到Money,所以不得不慎重.同时,用户对最大访问量也提出了要求.为了避免Mysql成为性能瓶颈并具备很好的容错能力,特此实现主从热备和读写分离. ...
- python string 连接test
def strTest(): name = "" for i in range(10): name += "hello" #print name def str ...
- 基于SMB协议的共享文件读写
一.SMB协议 SMB协议是基于TCP-NETBIOS下的,一般端口使用为139,445. 服务器信息块(SMB)协议是一种IBM协议,用于在计算机间共享文件.打印机.串口等.SMB 协议可以用在因特 ...