2016-03-28 5 views
-1

Я делаю пользовательскую камеру, которая фотографирует документы и отправляет их по сети. Затем изображения будут распознаны. Для их отправки по сети они должны быть небольшого размера (менее 100 Кб). Сначала я уменьшаю изображение, а затем преобразую его в шкалу серого и сжимаю JPG со 100%. Тем не менее размер изображения больше 100Kb. Если я уменьшу процент сжатия JPG, качество действительно плохое. Как решить эту проблему. Вот код:Сжатие изображения при сохранении качества

// Image Scaling

public static Bitmap decodeSampledBitmapFromResource(byte[] data, 
                 int reqWidth, int reqHeight) { 
     final BitmapFactory.Options options = new BitmapFactory.Options(); 
     options.inJustDecodeBounds = true; 
     BitmapFactory.decodeByteArray(data, 0, data.length, options); 
     options.inSampleSize = calculateInSampleSize(options, reqWidth, reqHeight); 
     options.inJustDecodeBounds = false; 
     options.inPreferredConfig = Bitmap.Config.ARGB_8888; 
     return BitmapFactory.decodeByteArray(data, 0, data.length, options); 
    } 

// полутоновое изображение. Использование Renderscript сжатия

uchar grayscale = pixelIn.r * 0.299 + pixelIn.g * 0.587 + pixelIn.b * 0.114; 

uchar4 pixelOut; 
pixelOut.a = pixelIn.a; 
pixelOut.r = grayscale; 
pixelOut.g = grayscale; 
pixelOut.b = grayscale; 

return pixelOut; 

// JPG

bitmap.compress(Bitmap.CompressFormat.JPEG, 100, outStream); 

ответ

2

Посмотрите this статью, я уверен, что вы получите то, что вы хотите.

0

Что у вас есть, если вы используете Bitmap.CompressFormat.PNG вместо этого? И как насчет попытки сжать изображение (всегда в 2 раза по документам)

JPEG полноцветный, поэтому преобразование в оттенки серого не помогает в конце, GIF имеет 8-битный индекс или оттенки серого, поэтому даже это стоит попробовать.

0

Храните качество. Сжатие изображений. Используйте ShortPixel. Даже для 10 МБ/изображений.

0

Есть три вещи, которые могут помочь в уменьшении размера изображения: сворачивают изображения, сохраняя при этом соотношение сторон:

public static Bitmap decodeSampledBitmapFromResource(byte[] data, 
                  int reqWidth, int reqHeight) { 
      final BitmapFactory.Options options = new BitmapFactory.Options(); 
      options.inJustDecodeBounds = true; 
      BitmapFactory.decodeByteArray(data, 0, data.length, options); 
      options.inSampleSize = calculateInSampleSize(options, reqWidth, reqHeight); 
      options.inJustDecodeBounds = false; 
      options.inPreferredConfig = Bitmap.Config.RGB565; 
      return BitmapFactory.decodeByteArray(data, 0, data.length, options); 
     } 

Удалить альфа-канал, с помощью следующей конфигурации:

options.inPreferredConfig = Bitmap.Config.RGB565; 

Сжатие изображения с использованием сжатия JPEG:

bitmap.compress(Bitmap.CompressFormat.JPEG, 100, outStream); 

100 без сжатия и 0 100% сжатие

GrayScaling не уменьшает размер.

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