zoukankan      html  css  js  c++  java
  • 图片 压缩

    原文http://cuisuqiang.iteye.com/blog/2045855

     

    整理文档,搜刮出一个Java做图片压缩的代码,稍微整理精简一下做下分享。
    首先,要压缩的图片格式不能说动态图片,你可以使用bmp、png、gif等,至于压缩质量,可以通过BufferedImage来指定。
    在C盘的temp下放置一张图片pic123.jpg,尽量找一个像素高一点的图片,这里我找了一张5616*3744的。

    Java代码收藏代码

    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. }

     

    运行后在C盘temp下生成一个465.jpg,像素大小为600*400,像素大小是我指定的。用时也就是一两秒的事情,注意,我这张图片是10M的,压缩后是40.5KB
    一些细节事项可以参考代码中的注释。

     

    要注意的是,你可能想试一试较大图片的处理能力,如果你的JDK没有指定默认内存,那可能会有如下异常,因为内存不够大:

    Java代码收藏代码
    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)

     

    解决方法:
    在Eclipse里选:Window->Preference->Installed JREs->Edit(选中jre),
    在Default VM Arguments里输入-Xms256m -Xmx1024m,表示最小堆内存256M,最大堆1G,然后运行就可以了

  • 相关阅读:
    android自定义TabView实现圆角列表
    自己封装的android客户端http网络框架
    android中无限循环滑动的gallery实例
    Android软键盘遮挡布局的那些事
    Android开发艺术2之Activity的启动模式
    各位Coder看过来
    Android开发艺术1之Activity的生命周期
    H5与Android之间的交互
    Android中那些有你不知道的事
    Xmpp实现简单聊天系列 --- ②用户注册和登陆
  • 原文地址:https://www.cnblogs.com/xue88ming/p/7183022.html
Copyright © 2011-2022 走看看