2016-01-13 4 views
1

есть способ, которым я могу сжать изображение 115kb, чтобы быть 4kb в android Без ущерба для его размера?. просто уменьшая его качество?Как уменьшить качество растрового изображения без ущерба для его размера

я знаю только с помощью

  • BitmapFactory.Options, что снижает как размер и качество

  • Bitmap.compress, который не дает вам возможности для определения размера в байтах.

общественного Bitmap compressImage (String ImagePath) {

BitmapFactory.Options options = new BitmapFactory.Options(); 
    options.inJustDecodeBounds = true; 
    bmp = BitmapFactory.decodeStream(new FileInputStream(imagePath),null, options); 


    options.inSampleSize = calculateInSampleSize(options, actualWidth, actualHeight); 
    options.inJustDecodeBounds = false; 
    bmp = BitmapFactory.decodeStream(new FileInputStream(imagePath),null, options); 

    return bmp; 
} 



public int calculateInSampleSize(BitmapFactory.Options options, int reqWidth, int reqHeight) { 
    final int height = options.outHeight; 
    final int width = options.outWidth; 
    int inSampleSize = 1; 

    if (height > reqHeight || width > reqWidth) { 
    final int heightRatio = Math.round((float) height/(float) reqHeight); 
    final int widthRatio = Math.round((float) width/(float) reqWidth); 
    inSampleSize = heightRatio < widthRatio ? heightRatio : widthRatio; 
    } 
    final float totalPixels = width * height; 
    final float totalReqPixelsCap = reqWidth * reqHeight * 2; 

    while (totalPixels/(inSampleSize * inSampleSize) > totalReqPixelsCap) { 
    inSampleSize++; 
    } 

    return inSampleSize; 
} 
+0

Почему вам это нужно? избежать OOME? это не поможет! ... не имеет значения, имеет ли файл, из которого декодирован битмап, 4 КБ или 1 МБ ... ** объект Bitmap будет брать тот же объем памяти, что зависит только от ширины и высоты растрового изображения и формата пикселей ** – Selvin

+0

@Selvin i не нужно, чтобы избежать OOME. на самом деле я пытаюсь реализовать приложение для обмена изображениями, например whatsapp, где пользователь увидит, как выглядит изображение перед загрузкой. поэтому я думаю о том, чтобы отправить изображение с такими же размерами, как оригинальное, но низкое качество для пользователя через googles GCM, который ограничивает загрузку данных до 4kb :( –

+0

нет другого способа попробовать bitmap.compress (Bitmap.CompressFormat.JPG, q) 'с разным значением' q' ... но вы можете попытаться разбить файл на 4kb pices ... или использовать API-драйв Google (или любое другое хранилище) и отправить только ссылку – Selvin

ответ

0

Изображение повторно проклейки означает, что вы собираетесь сократить разрешение изображения. предположим, что пользователь выбирает изображение 1000 * 1000 px. вы собираетесь преобразовать изображение в 300 * 300 изображений. поэтому размер изображения будет уменьшен.

И сжатие изображения уменьшает размер файла изображения без ущерба для разрешения. Конечно, уменьшение размера файла повлияет на качество изображения. Существует множество доступных алгоритмов сжатия, которые могут уменьшить размер файла, не оказывая большого влияния на качество изображения.

Один удобный способ я нашел в здесь:

Bitmap original = BitmapFactory.decodeStream(getAssets().open("1024x768.jpg")); 
ByteArrayOutputStream out = new ByteArrayOutputStream(); 
original.compress(Bitmap.CompressFormat.PNG, 100, out); 
Bitmap decoded = BitmapFactory.decodeStream(new ByteArrayInputStream(out.toByteArray())); 

Log.e("Original dimensions", original.getWidth()+" "+original.getHeight()); 
Log.e("Compressed dimensions", decoded.getWidth()+" "+decoded.getHeight()); 

дает

12-07 17: 43: 36.333: E/Оригинальные размеры (278): 1024 768 12-07

17: 43: 36,333: E/Сжатые размеры (278): 1024 768

+0

Я хочу сжатое изображение с тем же размером, что и оригинал, но низкого качества. я пытаюсь реализовать совместное использование изображений, например whatsapp, где, если я отправлю вам изображение, вы увидите, как выглядит изображение перед загрузкой с сервера. это означает, что мне нужно отправить изображение низкого качества пользователю, где я думаю об этом, используя GCM Google go **, который не позволяет загружать данные более 4kb ** –

+0

. В этом случае почему бы не попробовать это: http: // voidcanvas .com/whatsapp-like-image-compression-in-android/ – OBX

0
public static int getSquareCropDimensionForBitmap(Bitmap bitmap) 
{ 
    int dimension; 
    //If the bitmap is wider than it is tall 
    //use the height as the square crop dimension 
    if (bitmap.getWidth() >= bitmap.getHeight()) 
    { 
     dimension = bitmap.getHeight(); 
    } 
    //If the bitmap is taller than it is wide 
    //use the width as the square crop dimension 
    else 
    { 
     dimension = bitmap.getWidth(); 
    } 

return dimension; 
} 

int dimension = getSquareCropDimensionForBitmap (bitmap);

 System.out.println("before cropped height " + bitmap.getHeight() + "and width: " + bitmap.getWidth()); 
     Bitmap croppedBitmap = ThumbnailUtils.extractThumbnail(bitmap, dimension, dimension); 
     System.out.println("after cropped height "+croppedBitmap.getHeight() +"and width: " + croppedBitmap.getWidth()); 

можно обрезать и может уменьшить размер и можно указать уры собственного размера

+0

Я дам ему попробовать и дать вам ответ –

+0

для моего случая, вышеупомянутое решение удалось уменьшить качество, но ** количество байтов было по-прежнему велико ** поэтому я закончил использование 'bitmap.compress (Bitmap.CompressFormat.JPEG, 10, outputStream)', который был в порядке со мной –

Смежные вопросы