图片压缩的另一种实现(3)

import java.awt.Graphics;
import java.awt.image.BufferedImage;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.HttpURLConnection;
import java.net.URL;

import javax.imageio.IIOException;
import javax.imageio.ImageIO;

public class ImageUtils {

	/**
	 * 对图片进行放大或者压缩
	 * 
	 * @param srcPath
	 *            原始图片路径(绝对路径)
	 * @param newPath
	 *            处理后图片路径(绝对路径)
	 * @param w
	 *            目标宽度
	 * @param h
	 *            目标高度
	 * @return 是否处理成功
	 */
	public static boolean zoomInImage(String srcPath, String newPath,
			Integer w, Integer h) {
		BufferedImage bufferedImage = null;
		try {
			File file = new File(srcPath);
			if (file.canRead()) {
				try{
					bufferedImage = ImageIO.read(file);
				}catch(IIOException e){
					e.printStackTrace();
					return false;
				}
			} else {
				System.out.println("文件不存在或没有权限读取:" + srcPath);
				return false;
			}
		} catch (IOException e) {
			// TODO: 打印日志
			e.printStackTrace();
			return false;
		}
		if (bufferedImage != null) {
			bufferedImage = zoomInImage(bufferedImage, w, h);
			try {
				// 保存修改后的图像,全部保存为JPG格式
				ImageIO.write(bufferedImage, "JPG", new File(newPath)); 
				System.out.println("压缩后的图片已保存到磁盘");
			} catch (IOException e) {
				// TODO 打印错误信息
				e.printStackTrace();
				return false;
			}
		}
		return true;
	}

	/**
	 * 对图片进行放大或者压缩处理
	 * 
	 * @param originalImage
	 *            原始图片
	 * @param times
	 *            放大倍数
	 * @return
	 */
	public static BufferedImage zoomInImage(BufferedImage originalImage,
			Integer width, Integer height) {
		BufferedImage newImage = new BufferedImage(width, height,
				originalImage.getType());
		Graphics g = newImage.getGraphics();
		g.drawImage(originalImage, 0, 0, width, height, null);
		System.out.println("图片压缩成功");
		g.dispose();
		return newImage;
	}

	/**
	 * 将图片写入到磁盘
	 * 
	 * @param img
	 *            图片数据流
	 * @param fileName
	 *            文件保存时的名称
	 */
	public static void writeImageToDisk(byte[] img, String fileSrc) {
		try {
			File file = new File( fileSrc);
			FileOutputStream fops = new FileOutputStream(file);
			fops.write(img);
			fops.flush();
			fops.close();
			System.out.println("原图已下载到本地磁盘");
		} catch (Exception e) {
			e.printStackTrace();
		}
	}

	/**
	 * 根据地址获得数据的字节流
	 * 
	 * @param strUrl
	 *            网络连接地址
	 * @return
	 */
	public static byte[] getImageFromNetByUrl(String strUrl) {
		try {
			URL url = new URL(strUrl);
			HttpURLConnection conn = (HttpURLConnection) url.openConnection();
			conn.setRequestMethod("GET");
			conn.setConnectTimeout(5 * 1000);
			InputStream inStream = conn.getInputStream();// 通过输入流获取图片数据
			byte[] btImg = readInputStream(inStream);// 得到图片的二进制数据
			return btImg;
		} catch (Exception e) {
			e.printStackTrace();
		}
		return null;
	}

	/**
	 * 从输入流中获取数据
	 * 
	 * @param inStream
	 *            输入流
	 * @return
	 * @throws Exception
	 */
	public static byte[] readInputStream(InputStream inStream) throws Exception {
		ByteArrayOutputStream outStream = new ByteArrayOutputStream();
		byte[] buffer = new byte[1024];
		int len = 0;
		while ((len = inStream.read(buffer)) != -1) {
			outStream.write(buffer, 0, len);
		}
		inStream.close();
		return outStream.toByteArray();
	}

	public static void main(String[] args) {
		// 图片url,压缩后的宽和高
		String url = "/upload/c671c57023e6eb83a1fa492babf0779e.jpg";
		int w = 700;
		int h = 500;

		//获取图片访问真实url
		if(url.startsWith("/")){
			url = "http://localhost"+url;
		}

		String newDir = "/var/imgcompress/";
		String newName = MD5Util.encodeMD5(url);

		//从网络下载图片并保存到本地磁盘
		String srcPath = newDir + newName + url.substring(url.indexOf("."));
		writeImageToDisk(getImageFromNetByUrl(url),srcPath);

		//压缩后的图片路径
		String filePath = newDir + newName + "_" + w + "_" + h
				+ url.substring(url.indexOf("."));
		System.out.println(filePath);
		// 测试
		boolean test = zoomInImage(srcPath, filePath, w, h);
		if (test) {
			System.out.println("ok");
		}
	}

}
时间: 2024-10-25 18:37:23

图片压缩的另一种实现(3)的相关文章

android图片压缩的3种方法实例

android 图片压缩方法: 第一:质量压缩法: private Bitmap compressImage(Bitmap image) { ByteArrayOutputStream baos = new ByteArrayOutputStream();        image.compress(Bitmap.CompressFormat.JPEG, 100, baos);//质量压缩方法,这里100表示不压缩,把压缩后的数据存放到baos中        int options = 100

iOS开发探索-图片压缩处理

介绍: 压: 指文件体积变小,但是像素数不变,长宽尺寸不变,那么质量可能下降.缩: 指文件的尺寸变小,也就是像素数减少,而长宽尺寸变小,文件体积同样会减小. 应用: 在实际开发中,我们经常会对图片进行处理,满足开发需求,以下介绍三种图片压缩处理: 1.压缩图片质量(图片体积减小,像素不变) 两种读取图片数据的简单方法:(1).UIImageJPEGRepresentation函数需要两个参数:图片的引用和压缩系数,压缩体积不是随压缩系数比例变化的.(2).UIImagePNGRepresenta

CxImager图片压缩助手v1.1免费版[下载]

CxImager图片压缩助手v1.1运行环境:WinXP/2003/Vista/Win2008/Win7软件版本:1.1软件大小:1.37M软件语言:简体中文软件类型:系统工具授权方式:免费版推荐星级:★★★★★ 修改时间: 2015年10月25日 12:38:28 MD5: 634F21AB6109A59F3A1DCC5AFA2F7F5A SHA1: 1AAA0E18AB20650DB3B4E846EA3F6FB7FDEEA7C0 CRC32: 00F6A62B 下载地址: 软件简介:   C

Android图片压缩(质量压缩和尺寸压缩)

在网上调查了图片压缩的方法并实装后,大致上可以认为有两类压缩:质量压缩(不改变图片的尺寸)和尺寸压缩(相当于是像素上的压缩):质量压缩一般可用于上传大图前的处理,这样就可以节省一定的流量,毕竟现在的手机拍照都能达到3M左右了,尺寸压缩一般可用于生成缩略图.两种方法都实装在了我的项目中,结果却发现在质量压缩的模块中,本来1.9M的图片压缩后反而变成3M多了,很是奇怪,再做了进一步调查终于知道原因了.下面这个博客说的比较清晰: android图片压缩总结 总结来看,图片有三种存在形式:硬盘上时是fi

iOS 图片压缩

iOS的图片压缩,目前我在用的有两种: 一.在内存中压缩 需要消耗内存,如果图片较多,可能会造成crash //压缩图片质量   +(UIImage *)reduceImage:(UIImage *)image percent:(float)percent   {       NSData *imageData = UIImageJPEGRepresentation(image, percent);       UIImage *newImage = [UIImage imageWithData

Android 之 图片压缩

在上一篇文章中(Android之图片变换)主要说明了bitmap的使用,当然其中也包括一点图片压缩的内容,但是没有详细描述,这篇文章就来阐述一下平时Android使用的图片压缩技术 从图片的压缩方式区分:质量压缩和尺寸压缩. 质量压缩是在保持像素的前提下改变图片的位深及透明度等,来达到压缩图片的目的,经过它压缩的图片文件大小会有改变,但是导入成bitmap后占得内存是不变的.因为要保持像素不变,所以它就无法无限压缩,到达一个值之后就不会继续变小了.显然这个方法并不适用与缩略图,其实也不适用于想通

Android图片压缩技巧

请尊重他人的劳动成果,转载请注明出处:Android图片压缩技巧 http://blog.csdn.net/fengyuzhengfan/article/details/41759835 当需要将Android客户端的图片上传到服务器时,往往需要将图片进行压缩,关于图片的压缩方法,小编分享几种常用的方式: 第一种方式:裁切以达到压缩的目的 我曾在<Android开发之裁剪照片>一文中详细介绍过如何裁切照片,感兴趣的朋友可以去看一下. 第二种方式:将图片进行降质处理(即降低图片的质量)以达到压缩

Android BitmapFactory图片压缩处理(大位图二次采样压缩处理)

Android实际开发中,在加载大量图片的时候,比如ViewPager.GridView.ListView中,加载了大量的比较大图片就容易出现OOM(内存溢出)的异常,这是因为一个应用的最大内存使用只有16M,超过了这个值,就会出现OOM.所以我们实际开发中,要想避免OOM出现就要对相应的图片进行压缩处理. 本文即使用了BitmapFactory和BitmapFactory.Option这两个类,对图片进行相应的尺寸压缩处理.经测试,成功解决了未压缩图片之前出现的OOM异常. 实现效果图: 本D

图片压缩之处理小图片压缩策略

在进行图片压缩的时候.有时候会碰到要压缩的图片尺寸小于指定的压缩尺寸,若直接压缩会导致图片失真. 当然.最好的方式是挑选合适尺寸图片进行上传. 这里给出的方法是:对不足尺寸部分进行空白填充. 详细參见下面代码 using System; using System.Drawing.Drawing2D; using System.Drawing; using System.IO; using System.Drawing.Imaging; namespace CommonLib { public c