写入文件之前和之后的字节数组的大小是不同的原因

时间:2015-10-23 06:21:06

标签: android performance

public void onPictureTaken(byte[] data, Camera camera) {

    Uri imageFileUri = null;

    BitmapFactory.Options bmpFactoryOptions = new BitmapFactory.Options();
    bmpFactoryOptions.inJustDecodeBounds = true;
    Bitmap mBitmap = BitmapFactory.decodeByteArray(data, 0, data.length, bmpFactoryOptions);

    Log.d("SIZE", "mBitmap size :" + data.length);

    bmpFactoryOptions.inJustDecodeBounds = false;
    mBitmap = BitmapFactory.decodeByteArray(data, 0, data.length, bmpFactoryOptions);
    imageFileUri = getApplicationContext().getContentResolver().insert(
            MediaStore.Images.Media.EXTERNAL_CONTENT_URI, new ContentValues());
    OutputStream imageFileOS = getContentResolver().openOutputStream(imageFileUri);
    mBitmap.compress(Bitmap.CompressFormat.JPEG, 100, imageFileOS);

    imageFileOS.flush();
    imageFileOS.close();


    ByteArrayOutputStream stream1 = new ByteArrayOutputStream();
    mBitmap.compress(Bitmap.CompressFormat.JPEG, 100, stream1);
    byte[] imageInByte1 = stream1.toByteArray();
    long lengthbmp1 = imageInByte1.length;
    Log.d("SIZE", "ByteArrayOutputStream1 size :" + lengthbmp1);

日志的输出如下所示:

  

D / SIZE(23100):mBitmap size:4858755
  D / SIZE(23100):ByteArrayOutputStream1大小:8931843

任何人都可以帮助我为什么会有这种差异。 我需要根据大小压缩图像,但不会压缩大小变得不同..

2 个答案:

答案 0 :(得分:0)

您似乎正在加载图像,然后重新压缩到位图

mBitmap.compress(Bitmap.CompressFormat.JPEG, 100, stream1);

然后你想知道为什么图像尺寸不一样?答案是你重新编码了它。压缩率是100吗?如果加载压缩率为80%的位图,然后在任何图像编辑器中将其重新保存为100%,则尺寸将会增大。

答案 1 :(得分:0)

第一个问题是当你已经拥有字节时重新编码位图的原因。您观察到的尺寸差异来自不同的压缩。相机应用程序通常会以低于100的质量压缩图像,但您将其重新压缩为100.很明显,您的图像表示将需要更多空间。

如果确实需要重新压缩(例如,如果您以某种方式更改了图像),请尝试降低质量因素以获得更好的压缩效果。根据你的形象,90到100之间可能会有效。