第九周作业 实现图片压缩

背景:

现在的网站为提升与用户的交互,上传文件是难免的,用户上传的图片多种多样,方面有文件大小,尺寸,等等为了处理此类的问题。服务器端必须实现对用户上传的图片进行相应的处理以适应网站的需要。其中最重要的就是压缩图片,将用户上传的图片压缩成宽度等比里大小的图片。

实现方式:

java实现图片压缩:java有实现图片压缩的jar包,压缩的源文件的格式包括bmp,jig,jpg等等,还有的是压缩动态图片jar,但要购买。价格是好像要几百块人民币。接下里演示的是一个实现简单图片压缩的代码,不包括动态图片,免费的。

代码不是我写的,我在一个论坛看到的。但我测试过可以实现图片的压缩,可以随便看一下。

  1 package cn.hp.utils;
  2
  3 import java.awt.Color;
  4 import java.awt.Component;
  5 import java.awt.Graphics;
  6 import java.awt.Graphics2D;
  7 import java.awt.Image;
  8 import java.awt.MediaTracker;
  9 import java.awt.Toolkit;
 10 import java.awt.image.BufferedImage;
 11 import java.awt.image.ConvolveOp;
 12 import java.awt.image.Kernel;
 13 import java.io.ByteArrayOutputStream;
 14 import java.io.File;
 15 import java.io.FileInputStream;
 16 import java.io.FileOutputStream;
 17 import java.io.IOException;
 18 import java.io.OutputStream;
 19
 20 import javax.imageio.ImageIO;
 21 import javax.swing.ImageIcon;
 22
 23 import com.sun.image.codec.jpeg.JPEGCodec;
 24 import com.sun.image.codec.jpeg.JPEGEncodeParam;
 25 import com.sun.image.codec.jpeg.JPEGImageEncoder;
 26
 27 /**
 28  * 图像压缩工具
 29  * @author [email protected]
 30  *
 31  */
 32 public class ImageSizer {
 33     public static final MediaTracker tracker = new MediaTracker(new Component() {
 34         private static final long serialVersionUID = 1234162663955668507L;}
 35     );
 36     /**
 37      * @param originalFile 原图像
 38      * @param resizedFile 压缩后的图像
 39      * @param width 图像宽
 40      * @param format 图片格式 jpg, png, gif(非动画)
 41      * @throws IOException
 42      */
 43     public static void resize(File originalFile, File resizedFile, int width, String format) throws IOException {
 44         if(format!=null && "gif".equals(format.toLowerCase())){
 45             resize(originalFile, resizedFile, width, 1);
 46             return;
 47         }
 48         FileInputStream fis = new FileInputStream(originalFile);
 49         ByteArrayOutputStream byteStream = new ByteArrayOutputStream();
 50         int readLength = -1;
 51         int bufferSize = 1024;
 52         byte bytes[] = new byte[bufferSize];
 53         while ((readLength = fis.read(bytes, 0, bufferSize)) != -1) {
 54             byteStream.write(bytes, 0, readLength);
 55         }
 56         byte[] in = byteStream.toByteArray();
 57         fis.close();
 58         byteStream.close();
 59
 60         Image inputImage = Toolkit.getDefaultToolkit().createImage( in );
 61         waitForImage( inputImage );
 62         int imageWidth = inputImage.getWidth( null );
 63         if ( imageWidth < 1 )
 64            throw new IllegalArgumentException( "image width " + imageWidth + " is out of range" );
 65         int imageHeight = inputImage.getHeight( null );
 66         if ( imageHeight < 1 )
 67            throw new IllegalArgumentException( "image height " + imageHeight + " is out of range" );
 68
 69         // Create output image.
 70         int height = -1;
 71         double scaleW = (double) imageWidth / (double) width;
 72         double scaleY = (double) imageHeight / (double) height;
 73         if (scaleW >= 0 && scaleY >=0) {
 74             if (scaleW > scaleY) {
 75                 height = -1;
 76             } else {
 77                 width = -1;
 78             }
 79         }
 80         Image outputImage = inputImage.getScaledInstance( width, height, java.awt.Image.SCALE_DEFAULT);
 81         checkImage( outputImage );
 82         encode(new FileOutputStream(resizedFile), outputImage, format);
 83     }
 84
 85     /** Checks the given image for valid width and height. */
 86     private static void checkImage( Image image ) {
 87        waitForImage( image );
 88        int imageWidth = image.getWidth( null );
 89        if ( imageWidth < 1 )
 90           throw new IllegalArgumentException( "image width " + imageWidth + " is out of range" );
 91        int imageHeight = image.getHeight( null );
 92        if ( imageHeight < 1 )
 93           throw new IllegalArgumentException( "image height " + imageHeight + " is out of range" );
 94     }
 95
 96     /** Waits for given image to load. Use before querying image height/width/colors. */
 97     private static void waitForImage( Image image ) {
 98        try {
 99           tracker.addImage( image, 0 );
100           tracker.waitForID( 0 );
101           tracker.removeImage(image, 0);
102        } catch( InterruptedException e ) { e.printStackTrace(); }
103     }
104
105     /** Encodes the given image at the given quality to the output stream. */
106     private static void encode( OutputStream outputStream, Image outputImage, String format )
107        throws java.io.IOException {
108        int outputWidth  = outputImage.getWidth( null );
109        if ( outputWidth < 1 )
110           throw new IllegalArgumentException( "output image width " + outputWidth + " is out of range" );
111        int outputHeight = outputImage.getHeight( null );
112        if ( outputHeight < 1 )
113           throw new IllegalArgumentException( "output image height " + outputHeight + " is out of range" );
114
115        // Get a buffered image from the image.
116        BufferedImage bi = new BufferedImage( outputWidth, outputHeight,
117           BufferedImage.TYPE_INT_RGB );
118        Graphics2D biContext = bi.createGraphics();
119        biContext.drawImage( outputImage, 0, 0, null );
120        ImageIO.write(bi, format, outputStream);
121        outputStream.flush();
122     }
123
124     /**
125      * 缩放gif图片
126      * @param originalFile 原图片
127      * @param resizedFile 缩放后的图片
128      * @param newWidth 宽度
129      * @param quality 缩放比例 (等比例)
130      * @throws IOException
131      */
132     private static void resize(File originalFile, File resizedFile, int newWidth, float quality) throws IOException {
133         if (quality < 0 || quality > 1) {
134             throw new IllegalArgumentException("Quality has to be between 0 and 1");
135         }
136         ImageIcon ii = new ImageIcon(originalFile.getCanonicalPath());
137         Image i = ii.getImage();
138         Image resizedImage = null;
139         int iWidth = i.getWidth(null);
140         int iHeight = i.getHeight(null);
141         if (iWidth > iHeight) {
142             resizedImage = i.getScaledInstance(newWidth, (newWidth * iHeight) / iWidth, Image.SCALE_SMOOTH);
143         } else {
144             resizedImage = i.getScaledInstance((newWidth * iWidth) / iHeight, newWidth, Image.SCALE_SMOOTH);
145         }
146         // This code ensures that all the pixels in the image are loaded.
147         Image temp = new ImageIcon(resizedImage).getImage();
148         // Create the buffered image.
149         BufferedImage bufferedImage = new BufferedImage(temp.getWidth(null), temp.getHeight(null),
150                                                         BufferedImage.TYPE_INT_RGB);
151         // Copy image to buffered image.
152         Graphics g = bufferedImage.createGraphics();
153         // Clear background and paint the image.
154         g.setColor(Color.white);
155         g.fillRect(0, 0, temp.getWidth(null), temp.getHeight(null));
156         g.drawImage(temp, 0, 0, null);
157         g.dispose();
158         // Soften.
159         float softenFactor = 0.05f;
160         float[] softenArray = {0, softenFactor, 0, softenFactor, 1-(softenFactor*4), softenFactor, 0, softenFactor, 0};
161         Kernel kernel = new Kernel(3, 3, softenArray);
162         ConvolveOp cOp = new ConvolveOp(kernel, ConvolveOp.EDGE_NO_OP, null);
163         bufferedImage = cOp.filter(bufferedImage, null);
164         // Write the jpeg to a file.
165         FileOutputStream out = new FileOutputStream(resizedFile);
166         // Encodes image as a JPEG data stream
167         JPEGImageEncoder encoder = JPEGCodec.createJPEGEncoder(out);
168         JPEGEncodeParam param = encoder.getDefaultJPEGEncodeParam(bufferedImage);
169         param.setQuality(quality, true);
170         encoder.setJPEGEncodeParam(param);
171         encoder.encode(bufferedImage);
172     }
173 }

简单的单元测试类。

 1 package junit.test;
 2
 3 import java.io.File;
 4 import java.io.IOException;
 5
 6 import org.junit.Test;
 7
 8 import cn.hp.utils.ImageSizer;
 9
10
11 public class ImageTest {
12     @Test
13     public void createImage(){
14         try {
15             ImageSizer.resize(new File("d:\\12.jpg"), new File("d:\\testabc.jpg"), 200, "jpg");
16         } catch (IOException e) {
17             e.printStackTrace();
18         }
19     }
20
21 }

发现经过压缩后的图片大小变化了。

压缩前的图片大小

压缩后的图片大小

时间: 2024-12-29 12:14:14

第九周作业 实现图片压缩的相关文章

2017-2018-1 20179205《Linux内核原理与设计》第九周作业

<Linux内核原理与设计>第九周作业 视频学习及代码分析 一.进程调度时机与进程的切换 不同类型的进程有不同的调度需求,第一种分类:I/O-bound 会频繁的进程I/O,通常会花费很多时间等待I/O操作的完成:CPU-bound 是计算密集型,需要大量的CPU时间进行运算,使得其他交互式进程反应迟钝,因此需要不同的算法来使系统的运行更高效,以及CPU的资源最大限度的得到使用.第二种分类包括批处理进程(batch process):实时进程(real-time process)以及交互式进程

2017-2018-2 20179205《网络攻防技术与实践》第九周作业

<网络攻防技术与实践>第九周作业 视频学习总结 一.KaliSecurity压力测试工具 ??压力测试通过确定一个系统的瓶颈或者不能接受的性能点,来获得系统能够提供的最大的服务级别的测试.通俗地讲,压力测试是为了测试应用程序的性能会变得不可接受. ??Kali下压力测试工具包含VoIP压力测试.Web压力测试.网络压力测试及无线压力测试. 1.Voip压力测试工具 包括iaxflood和inviteflood 2.web压力测试工具:THC-SSL-DOS ??借助THC-SSL-DOS攻击工

机电传动控制第九周作业(一)

<机电传动控制>第九周作业(一) 1单相桥式晶闸管整流电路仿真 搭建的模型图: 当触发角为pi/4时,仿真结果为: 当触发角为pi/2时:仿真结果为: 触发角为pi/2,电感值为0.01时,仿真结果: 触发角为pi/2,电感值为1时,仿真结果为: 触发角为pi/2,电感值为0.5时,仿真结果: 触发角为pi/4,电感值为0.5时,仿真结果: 2三相六脉波桥式晶闸管整流电路仿真 搭建的电路图: 触发角为0,仿真结果: 触发角为pi/4,仿真结果: 触发角为pi/2,仿真结果: 触发角为0,电感为

机电传动控制作业第九周作业补充

机电传动控制作业第九周作业补充: 手绘波形图: 3. 直流电机开环调压调速系统模型搭建 搭建的电路图: 仿真结果之一: 问题: 我按照上图所示的电路进行仿真时,在调节电源电压的大小和触发角时,发现很难调节到使电机转速刚好在额定转速下运行,尤其在引入电感后,更加难以调节.所以我想问下老师我这个电路图搭建的有没有问题?我需要从何处改进呢?

201621123062《java程序设计》第九周作业总结

1. 本周学习总结 1.1 以你喜欢的方式(思维导图或其他)归纳总结集合与泛型相关内容. 思维导图1:(对集合部分做了一些改动和细化) 思维导图2:(泛型) 1.2 选做:收集你认为有用的代码片段 代码片段1:(取自PPT) 使用迭代器删除元素: List<String> list = new ArrayList<>(); list.add("a"); list.add("b"); list.add("c"); Itera

《网络攻防第九周作业》

一.教材学习 第九章:恶意代码安全攻防 恶意代码指的是使计算机按照攻击者的意图执行以达到恶意目标的指令集.恶意代码的执行目标是由编写者决定,满足他们心理上或利益上的一些需求,典型的攻击目标包括: (1)单纯的技术炫耀或恶作剧: (2)远程控制被攻击主机,使之能成为攻击者的傀儡主机,满足其实施跳板攻击或进一步传播恶意代码的需要: (3)窃取私人信息(如用户账号/密码,信用卡信息等)或机密信息(如商业机密.政治军事机密等): (4)窃取计算.存储.带宽资源: (5)拒绝服务.进行破环活动(如破环文件

《网络攻防》第九周作业

kali视频学习 第36节 压力测试工具1.VoIP压力测试工具web压力测试:2.thc-ssl-dos的验证.3.dhcpig 尝试耗尽所有IP地址4.ipv6工具包5.inundator IDS/IPS/WAF压力测试工具耗尽对方说的日志资源.6.macof可做泛红攻击8.t50压力测试9.无线压力测试mdk3和reaver 第37节 数字取证工具 数字取证技术是将计算机调查和分析技术应用于对潜在的.有法律效力的电子证据的确定与获取,同样他们都是针对黑客和入侵目的的.目的都是保证网络的安全

第九周作业三四题

3. 直流电机开环调压调速系统模型搭建(可以以小组形式完成作业,每个小组成员参与讨论并共同完成模型搭建) 通过采用PWM脉宽调压的方法搭建的模型如下: 模型缺点,需要通过电感来获得较为稳定的电压值以防止转速波动过大. 令占空比为1,得到最高转速 降低占空比至0.5,得到 占空比为0.2时,得到 由于负载的存在,当占空比为0.024时,可以得到接近于0的转速 4. 文献阅读: 阅读<自动化技术中的进给电气传动>第二章的2.1节,结合工程控制基础和数控技术的有关内容理解相关概念,在博客上列出感到理

马哥2016全新Linux+Python高端运维班第九周作业

1.详细描述一次加密通讯的过程,结合图示最佳. SSL协议基础: SSL协议位于TCP/IP协议与各种应用层协议之间,本身又分为两层: 1)SSL记录协议:建立在可靠传输层协议(TCP)之上,为上层协议提供数据封装.压缩.加密等基本功能. 2)SSL握手协议:在SSL记录协议之上,用于实际数据传输前,通讯双方进行身份认证.协商加密算法.交换加密密钥等. SSL协议通信过程: 1)浏览器发送一个连接请求给服务器:服务器将自己的证书(包含服务器公钥S_PuKey).对称加密算法种类及其他相关信息返回