如何像Facebook和WhatsApp那样优化图像呢?

时间:2014-08-12 08:54:45

标签: android image bitmap

我想像whatsapp和facebook一样优化图像文件大小。我在whatsapp上发送了5MB图像,并且接收到的图像大小为80KB。接收的图像看起来与原始图像相同,但分辨率低于原始图像。

我在stackoverflow上尝试了几乎所有的android图像压缩源代码,但这对我来说并不起作用。然后我遇到了this link以优化图像,这是很好的工作,但仍然没有像whatsapp那样得到结果。

如何在不降低图像质量的情况下实现最大图像压缩,就像whatsapp一样?

使用源代码回答将非常有帮助。

提前致谢。

2 个答案:

答案 0 :(得分:1)

您需要解码图像(位图)

这是代码。

public Bitmap  decodeFile(String path) {
        // Decode image size
        int orientation;
        try {
            if (path == null) {
                return null ;
            }
            BitmapFactory.Options o = new BitmapFactory.Options();
            o.inJustDecodeBounds = true;
            // Find the correct scale value. It should be the power of 2.
            final int REQUIRED_SIZE = 70;
            int width_tmp = o.outWidth, height_tmp = o.outHeight;
            int scale = 0;
            while (true) {
                if (width_tmp / 2 < REQUIRED_SIZE
                        || height_tmp / 2 < REQUIRED_SIZE)
                    break;
                width_tmp /= 2;
                height_tmp /= 2;
                scale++;
            }
            BitmapFactory.Options o2 = new BitmapFactory.Options();
            o2.inSampleSize = scale;
            Bitmap bm = BitmapFactory.decodeFile(path, o2);
            Bitmap bitmap = bm;
            ExifInterface exif = new ExifInterface(path);
            orientation = exif.getAttributeInt(ExifInterface.TAG_ORIENTATION, 1);

            Log.e("orientation", "" + orientation);
            bitmap = Bitmap.createBitmap(bm, 0, 0, bm.getWidth(),bm.getHeight(), null, true);
            ImageViewChooseImage.setImageBitmap(bitmap);
            bitmapfinal = bitmap;
            return bitmap ;
        } catch (Exception e) {
            e.printStackTrace();
            return null;
        }

    }

答案 1 :(得分:0)

将图像转换为位图并使用compress()方法将其压缩到一定的质量。 要保持图像质量,请使用高度和宽度的宽高比来减少它。您可以使用下面的代码:其中data是图像的字节数组

Bitmap screen = BitmapFactory.decodeByteArray(data, 0,
                    data.length);
            float oHeight = screen.getHeight();
            float oWidth = screen.getWidth();
            float aspectRatio = oWidth / oHeight;
            int newHeight = 0;
            int newWidth = 0;
            newHeight = 450;
            newWidth = (int) (newHeight * aspectRatio);
            screen = Bitmap.createScaledBitmap(screen, newWidth, newHeight,
                    true);
ByteArrayOutputStream bos = new ByteArrayOutputStream();
            screen.compress(Bitmap.CompressFormat.JPEG, 50, bos);