位图压缩不会改变位图的字节大小。

7

我正在尝试通过使用压缩方法来减小位图大小。

这是我的代码:

public Bitmap compressImage(Bitmap image) {
        Bitmap immagex = image;
        ByteArrayOutputStream baos = new ByteArrayOutputStream();

        Log.i("before compress", immagex.getByteCount()+"");

        boolean compress = immagex.compress(Bitmap.CompressFormat.JPEG, 10, baos);

        if(compress)
            Log.i("after compress", immagex.getByteCount()+"");
        else
            Log.i("bad compress", "bad compress");

        return immagex;
    }

当我检查我的日志时,我得到以下信息:
11-28 11:10:38.252: I/before compress(2429): 374544
11-28 11:10:38.262: I/after compress(2429): 374544

为什么压缩不起作用?
更新:
我尝试了这段代码:
public Bitmap compressImage(Bitmap image) {
        Bitmap immagex = image;
        ByteArrayOutputStream baos = new ByteArrayOutputStream();

        Log.i("before compress", immagex.getByteCount()+"");

        boolean compress = immagex.compress(Bitmap.CompressFormat.JPEG, 10, baos);

        Log.i("after compress 2", decodeSampledBitmapFromByte(image.getWidth(), image.getHeight(), baos.toByteArray()).getByteCount()+"");

        return immagex;
    }

仍然是相同的字节数

11-28 11:33:04.335: I/before compress(3472): 374544
11-28 11:33:04.395: I/after compress 2(3472): 374544

请参考以下链接:https://dev59.com/NWoy5IYBdhLWcg3wo_kn,了解如何在不改变位图大小的情况下进行位图压缩。 - prakash
1
这不是我的问题。 我不想缩放位图,只是为了通过改变其质量来减小它在内存中的大小。 - dasdasd
2
这个问题有解决方案吗?我在这里遇到了完全相同的问题。 - Prateek
我遇到了同样的问题。实际上,我的字节数组在较低的压缩参数下增加了。 - coolcool1994
3个回答

3
以下是将位图大小缩小并将其转换为base64的代码:
    Bitmap newBitmap = Bitmap.createScaledBitmap(bitmap, 50, 50, true);
    ByteArrayOutputStream baos = new ByteArrayOutputStream();
    newBitmap.compress(Bitmap.CompressFormat.JPEG, 100, baos);
    byte[] byteArray = baos.toByteArray();
    String imageEncoded = Base64.encodeToString(byteArray, Base64.DEFAULT);

    Log.e("Base 64 String", imageEncoded);

谢谢您的评论,但我已经尝试了其他不需要改变大小的解决方案... - dasdasd
这对我也没有用。这是Android的bug吗? - coolcool1994

0

使用Bitmap.compress()方法,您只需指定压缩算法,但是压缩操作需要相当长的时间。如果您需要调整大小以减少图像的内存分配,则需要使用Bitmap.Options对图像进行缩放,首先计算位图边界,然后将其解码为指定的大小。

我在StackOverflow上找到的最好的示例是这个。 加载图像到位图对象时出现奇怪的内存问题


2
我不想缩放位图只是为了降低它的质量。 - dasdasd

0

压缩不会改变位图的大小。您应该查看包含压缩数据的输出字节流的大小。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接