0x89 0x50 的错误讯息,搜刮出一个Java做图片压缩的代码

因为去掉一个BufferedImage的定义就能够正常裁切,去掉获取宽高的BufferedImage对象的定义,在 Ubuntu 下打开 jpg 图档时,0x89 0x50 的错误讯息,但该图档在 Windows 7 下却可以成功打开看到,打开时出现 Not a JPEG,尽量找一个像素高一点的图片,在C盘的temp下放置一张图片pic123.jpg,height = img.getHeight(null),  // 得到源图长

图片 4

图片裁切中遇见的小标题,图片裁切境遇题目

后天应用ImageIO贯彻裁切图片,蒙受了四个张冠李戴:

Not a JPEG file: starts with 0xff 0xd9

因为要获得裁剪原点和裁切尺寸,所以笔者想博得图片宽高,用异常的小的叁个看作裁切尺寸,进而获取二个星型的图,所以就有了如下代码:

File imageFile = new File(imageFileFullPath);
FileInputStream imageFileInputStream = new FileInputStream(imageFile);
// 获取原始图片,用于读取宽和高
BufferedImage bufferedImage = ImageIO.read(imageFileInputStream);
int imageWidth = bufferedImage.getWidth();
int imageHeight = bufferedImage.getHeight();
if(imageWidth == imageHeight) {
//直接返回,不进行裁切
}
// 取较小的数值为裁剪尺寸
int clipSize = imageWidth > imageHeight ? imageHeight : imageWidth;

而是在裁切并出口结果时,又用到了那般的代码:

Iterator<ImageReader> readerIt = ImageIO.getImageReadersByFormatName("jpg");
ImageReader reader = readerIt.next();
// 获取图片流
ImageInputStream imageInputStream = ImageIO.createImageInputStream(imageFileInputStream);
reader.setInput(imageInputStream, true);
Rectangle rectangle = new Rectangle(0, 0, clipSize, clipSize);

param.setSourceRegion(rectangle);

//读取选取的区域
BufferedImage clipedImage = reader.read(0, param);

没过多长期小编就找到了消除办法,以致于本人以为变成错误的由来正是概念了七个BufferedImage。这些消除办法是:去掉获得宽高的BufferedImage对象的定义,改用reader获取原始图片尺寸:

int imageWidth = reader.getWidth(0);
int imageHeight = reader.getHeight(0);

诸有此类就可以不荒谬运维了。以当下通晓的学问还无法领略小提起先提到的错误是何等冒出的,因为去掉三个BufferedImage的概念就可知健康裁切,所以本人想是还是不是不可能定义五个BufferedImage对象的案由,直到作者尝试了以下措施:

BufferedImage clipedImage = bufferedImage.getSubimage(0, 0, clipSize, clipSize);

代表上边的那第一次全国代表大会段代码,一样用到了五个BufferedImage对象,这种格局就可知很好地去实行。

后来作者又一连牵挂大概引致这么些荒唐的案由,发掘了贰个质疑之处:

// 获取原始图片,用于读取宽和高
BufferedImage bufferedImage = ImageIO.read(imageFileInputStream);

 这么些imageFileInputStream对象是已经读取到的图形对象,而ImageIO的read方法还会有多少个参数就是File,所以小编替换了弹指间:

BufferedImage bufferedImage = ImageIO.read(imageFile);

居然也裁切成功了!可是依旧未有从根本上领会错误现身的来头,临时记下,现在逐年开采。

图形裁切的代码参谋了:

再贴一个BufferedImage相关的好文:

前几天选用ImageIO落实裁切图片,碰着了二个谬误: Not a JPEG file: starts
with 0xff 0xd9 因为要获得裁…

Linux 下看不到图片难点的化解

在 Ubuntu 下开采 jpg 图档时,图片浏览器显示 Not a JPEG file: starts with
0x89 0x50 的一无所长消息,但该图档在 Windows 7
下却可以成功开荒看到,毕竟是怎么难点?

图片 1

遗闻是如此的,有位朋友传来用ZIP打包的数10个 jpg
格式图档,在那之中有50%可成功开采,另四分之二却不知何故,张开时出现 Not a JPEG
file: starts with 0x89 0x50
的错误音讯。起始感到是图档打包时出错,但对方重覆再传后,展开时依旧显示同一错误消息,无法看到,那时大家可测度不是包装时的主题素材了,或者个别图档真的有标题。Not
a JPEG file: starts with 0x89 0x50
的情趣,是程式告诉我们那么些档案根本不是 jpg,因为档头是 0x89 0x50,而0x89
0x50是 png 的。于是将该等 jpg 的延伸档名更换为 png
,就足以成功看到了。在 Windows 中常有将 png 存档为 jpg
的动静,希望那篇能够成为 Linux 用户的参照。

图片 2

Ubuntu 14.04 下载、安装、配置的连锁文化

Ubuntu 14.04连串下载地址:

Windows 7下硬盘安装Ubuntu
14.04图像和文字化教育程

下看不到图片难题的减轻 在 Ubuntu 下开垦 jpg
图档时,图片浏览器展现 Not a JPEG file: starts with 0x89 0x50
的荒谬音信,但该图档在 Windows…

在 Ubuntu 下展开 jpg
图档时,图片浏览器呈现 Not a JPEG file: starts with 0x89 0x50
的荒唐音讯,但该图档在 Windows 7 下却得以成功展开看到,毕竟是怎么着难点?

原文

import java.io.*;

图片 3

 

import java.util.Date;

传说是那样的,有位朋友传来用ZIP打包的数拾个 jpg
格式图档,个中有四分之二可成功开发,另二分一却不知怎么,展开时出现 Not a JPEG
file: starts with 0x89 0x50
的谬误音信。起初以为是图档打包时出错,但对方重覆再传后,展开时照旧显示同一错误信息,不只怕见到,这时大家可预计不是包装时的标题了,大概个别图档真的有标题。Not
a JPEG file: starts with 0x89 0x50
的意思,是程式告诉我们那些档案根本不是 jpg,因为档头是 0x89 0x50,而0x89
0x50是 png 的。于是将该等 jpg 的拉开档名改造为 png
,就足以成功看到了。在 Windows 中常有将 png 存档为 jpg
的情状,希望那篇能够产生 Linux 用户的参谋。

 

import java.util.UUID;

图片 4

整理文档,搜刮出二个Java做图片压缩的代码,稍微整理精简一下做下分享。
率先,要裁减的图片格式无法说动态图片,你能够动用bmp、png、gif等,至于压缩品质,可以因此BufferedImage来钦定。
在C盘的temp下放置一张图纸pic123.jpg,尽量找二个像素高级中学一年级点的图形,这里本人找了一张5616*3744的。

import java.awt.*;

Ubuntu 14.04 下载、安装、配置的相关知识
http://www.linuxidc.com/Linux/2014-04/100370.htm

Java代码图片 5

import java.awt.image.*;

Ubuntu
14.04种类下载地址
:http://www.linuxidc.com/Linux/2014-04/100352.htm

  1. packagetest;
  2. importjava.io.*;
  3. importjava.util.Date;
  4. importjava.awt.*;
  5. importjava.awt.image.*;
  6. importjavax.imageio.ImageIO;
  7. importcom.sun.image.codec.jpeg.*;
  8. /**
  9. *图表压缩管理
  10. *@author崔素强
  11. */
  12. publicclassImgCompress{
  13. privateImageimg;
  14. privateintwidth;
  15. privateintheight;
  16. @SuppressWarnings(“deprecation”)
  17. publicstaticvoidmain(String[]args)throwsException{
  18. System.out.println(“开始:”+newDate().toLocaleString());
  19. ImgCompressimgCom=newImgCompress(“C:\\temp\\pic123.jpg”);
  20. imgCom.resizeFix(400,400);
  21. System.out.println(“结束:”+newDate().toLocaleString());
  22. }
  23. /**
  24. *构造函数
  25. */
  26. publicImgCompress(StringfileName)throwsIOException{
  27. Filefile=newFile(fileName);//读入文件
  28. img=ImageIO.read(file);//构造Image对象
  29. width=img.getWidth(null);//获得源图宽
  30. height=img.getHeight(null);//得到源图长
  31. }
  32. /**
  33. *安份守己宽度依旧莫斯中国科学技术大学学进行削减
  34. *@paramwint最大开间
  35. *@paramhint最大惊人
  36. */
  37. publicvoidresizeFix(intw,inth)throwsIOException{
  38. if(width/height>w/h){
  39. resizeByWidth(w);
  40. }else{
  41. resizeByHeight(h);
  42. }
  43. }
  44. /**
  45. *以大幅度为标准,等比例放缩图片
  46. *@paramwint新宽度
  47. */
  48. publicvoidresizeByWidth(intw)throwsIOException{
  49. inth=(int)(height*w/width);
  50. resize(w,h);
  51. }
  52. /**
  53. *以万丈为原则,等比例缩放图片
  54. *@paramhint新高度
  55. */
  56. publicvoidresizeByHeight(inth)throwsIOException{
  57. intw=(int)(width*h/height);
  58. resize(w,h);
  59. }
  60. /**
  61. *强制削减/放大图片到定点的尺寸
  62. *@paramwint新宽度
  63. *@paramhint新高度
  64. */
  65. publicvoidresize(intw,inth)throwsIOException{
  66. //SCALE_SMOOTH的缩略算法生成缩略图片的平滑度的优先级比速度高生成的图形品质比较好但速度慢
  67. BufferedImageimage=newBufferedImage(w,h,BufferedImage.TYPE_INT_RGB);
  68. image.getGraphics().drawImage(img,0,0,w,h,null);//绘制裁减后的图
  69. FiledestFile=newFile(“C:\\temp\\456.jpg”);
  70. FileOutputStreamout=newFileOutputStream(destFile);//输出到文件流
  71. //能够符合规律达成bmp、png、gif转jpg
  72. JPEGImageEncoderencoder=JPEGCodec.createJPEGEncoder(out);
  73. encoder.encode(image);//JPEG编码
  74. out.close();
  75. }
  76. }

import javax.imageio.ImageIO;

Windows 7下硬盘安装Ubuntu
14.04图像和文字教程

http://www.linuxidc.com/Linux/2014-04/100369.htm

 

import com.sun.image.codec.jpeg.*;

越来越多Ubuntu相关消息见Ubuntu 专项论题页面 http://www.linuxidc.com/topicnews.aspx?tid=2

运营后在C盘temp下生成二个465.jpg,像素大小为600*400,像素大小是自己钦定的。用时也便是一两秒的事务,注意,小编这张图片是10M的,压缩后是40.5KB
有的细节事项能够参照他事他说加以考察代码中的注释。

/**

正文永世更新链接地址:http://www.linuxidc.com/Linux/2015-01/112455.htm

 

* 图片压缩管理

图片 6

要留神的是,你或者想试一试十分大图片的拍卖手艺,如若你的JDK未有一些名私下认可内存,那大概会有如下相当,因为内部存款和储蓄器相当不足大:

* @author 崔素强

Java代码图片 7

*/

  1. 开始:2014-4-1416:25:11
  2. Exceptioninthread”main”java.lang.OutOfMemoryError:Javaheapspace
  3. atjava.awt.image.DataBufferByte.<init>(DataBufferByte.java:58)
  4. atjava.awt.image.ComponentSampleModel.createDataBuffer(ComponentSampleModel.java:397)
  5. atjava.awt.image.Raster.createWritableRaster(Raster.java:938)
  6. atjavax.imageio.ImageTypeSpecifier.createBufferedImage(ImageTypeSpecifier.java:1169)
  7. atjavax.imageio.ImageReader.getDestination(ImageReader.java:2879)
  8. atcom.sun.imageio.plugins.jpeg.JPEGImageReader.readInternal(JPEGImageReader.java:943)
  9. atcom.sun.imageio.plugins.jpeg.JPEGImageReader.read(JPEGImageReader.java:915)
  10. atjavax.imageio.ImageIO.read(ImageIO.java:1422)
  11. atjavax.imageio.ImageIO.read(ImageIO.java:1282)
  12. attest.ImgCompress.<init>(ImgCompress.java:31)
  13. attest.ImgCompress.main(ImgCompress.java:21)

public class ImagesUtil {

 

private Image img;

解决措施:
在Eclipse里选:Window->Preference->Installed
JREs->Edit
(选中jre),
在Default VM Arguments里输入-Xms256m
-Xmx1024m
,表示小小的堆内部存款和储蓄器256M,最大堆1G,然后运转就能够了

private int width;

 

private int height;

@SuppressWarnings(“deprecation”)