关于Android的图片压缩优化或者算法

Keyoumi 发布于 2015/01/31 16:09
阅读 4K+
收藏 0
        各位大神有没有Android下的图片压缩优化的方法呢?
我要把一张300K的图片压缩成10k,在保证清晰度的同时,分辨率保持在在200*200上下。

我试用了网上的一堆对图片压缩的方法,压缩出来的图片都非常的模糊;PC端的图片处理软件处理出来的10K的图片也非常清晰,Android下的就不行了。拜托各位啦。

加载中
0
h
houj

如果图片不是透明的,  最好压缩成JPG格式,  通过图片质量参数折中控制文件大小和图片清晰度

bitmap.compress(Bitmap.CompressFormat.JPEG, quality, fos);   
//其中的quality为0~100, 可以压缩图片质量
不同的JPEG压缩算法本身没有太大的区别.

Keyoumi
Keyoumi
这个方法我试过了,我先将图片大小压缩,然后用这个方法压缩的质量。但是还是看起来比较的模糊,在都是10K的大小的前提下,没有电脑上处理出来的图片清楚。
0
亓斌哥哥
亓斌哥哥

参考参考我这个吧。

/**
	 * 压缩图片质量
	 * @param uri 图片uri
	 * @return	  压缩完成的图片路径
	 */
	public synchronized static String compressImage(String uri) {
		System.out.println("压缩前:" + new File(uri).length());
		if(new File(uri).length() <= 300 * 1024) {
			return uri;
		}
		
		try {
			String imageType = getImageType(uri).toLowerCase();
			String compressPath = AppUtils.getCacheDir().getPath()
					+ File.separator + "cp_" + Encrypt.md5(uri) + imageType;
			
			FileOutputStream out = new FileOutputStream(compressPath);
			
			BitmapFactory.Options opts = new BitmapFactory.Options();
			opts.inJustDecodeBounds = true;
			opts.inSampleSize = 3;
			BitmapFactory.decodeFile(uri, opts);
			opts.inJustDecodeBounds = false;
			Bitmap result = BitmapFactory.decodeFile(uri, opts);
			
			if(imageType.equals(".jpg") || imageType.equals(".jpeg")) {
				System.out.println("compress jpg: ");
				result.compress(CompressFormat.JPEG, 30, out);
			}else {
				System.out.println("compress png: ");
				result.compress(CompressFormat.PNG, 100, out);
			}
			out.close();
			System.out.println("压缩后: " + new File(compressPath).length());
			return compressPath;
			
//			if(imageType.equals(".jpg") || imageType.equals(".jpeg")) {
//				System.out.println("compress jpg: ");
//				Bitmap result = BitmapFactory.decodeFile(uri);
//				result.compress(CompressFormat.JPEG, 30, out);
//				out.close();
//				System.out.println("压缩后: " + new File(compressPath).length());
//				return compressPath;
//			}else if(imageType.equals(".png")) {
//				System.out.println("compress png: ");
//				BitmapFactory.Options opts = new BitmapFactory.Options();
//				opts.inJustDecodeBounds = true;
//				opts.inSampleSize = 3;
//				BitmapFactory.decodeFile(uri, opts);
//				opts.inJustDecodeBounds = false;
//				Bitmap result = BitmapFactory.decodeFile(uri, opts);
//				result.compress(CompressFormat.PNG, 100, out);
//				out.close();
//				System.out.println("压缩后: " + new File(compressPath).length());
//				return compressPath;
//			}
//			out.close();
		} catch (Exception e) {
			e.printStackTrace();
		}
		return uri;
	}
	
	/**
	 * 获取图片格式
	 * @param uri
	 * @return
	 */
	private synchronized static String getImageType(String uri) {
		String[] array = uri.split("\\.");
		return "." + array[array.length-1].toLowerCase();
	}



亓斌哥哥
亓斌哥哥
回复 @keyoumi : 这里有个细节 如果是jpg的话好像压缩没效果,或者反而变大了。
Keyoumi
Keyoumi
compress(CompressFormat.PNG, 100, out);这个方法试过了
0
卫慧杰
卫慧杰
可以试试 webp。或者使用 mozjpeg 的库
卫慧杰
卫慧杰
回复 @keyoumi : Android 要显示 bitmap 就是这么大的。只要不出现 oom 就不用操心。
Keyoumi
Keyoumi
非常感谢您的建议,webp能把图片缩到10k上下,也保持清晰。不过现在遇到一个问题,我保存的sd卡的图片为10k,再读取出来后变得非常大。 Bitmap bm = BitmapFactory.decodeFile(getSDCardPath()+"/tcb/image.webp");System.out.println("图片大小:"+bm.getByteCount());
返回顶部
顶部