Уменьшается размер файла при записи в Java

268
19 апреля 2017, 11:17

Есть bytearray, в котором хранятся байты картинки. Читал их с помощью OpenCV Imgcodecs.imread(). После этого сразу же записал их двумя способами в файл:

byte[] imageInByte = null;
Image image = new Image("./1.jpg");
BufferedImage im = ImageTransform.toBitmap(image);
ByteArrayOutputStream baos = new ByteArrayOutputStream();
try {
  ImageIO.write(im, "jpg", baos);
  imageInByte = baos.toByteArray();
  baos.close();
  // convert byte array back to BufferedImage
  InputStream in = new ByteArrayInputStream(imageInByte);
  BufferedImage bImageFromConvert = ImageIO.read(in);
  // 1 способ
  ImageIO.write(bImageFromConvert, "jpg", new File("./2.jpg"));
  // 2 способ
  FileOutputStream fos = new FileOutputStream("./2_fos.jpg");
  fos.write(imageInByte);
  fos.close();
  } catch (IOException e) {
  e.printStackTrace();
}

Исходный файл весит 104Kb. После сохранения фотографий двумя способами, они стали весить 49Kb. Вопрос: почему так, если никаких изменений в байты я не вносил? Можно было бы сослаться на OpenCV, мол, сжимает и т.д., но тогда почему и с помощью FileOutputStream сохраняется картинка с таким же размеров в Kb. Предполагаю, что при чтении картинки с помощью OpenCV Imgcodecs.imread(), оно заранее ужимает.

Answer 1

Кодек, который сохраняет jpg в OpenCV использует шкалу сжатия, от 0 до 100, где 100 - отсутствие сжатия.

Сохранение jpg без сжатия из Mat mat:

MatOfInt param = new MatOfInt(Imgcodecs.CV_IMWRITE_JPEG_QUALITY, 200);
Imgcodecs.imwrite("jpgWithnoutCompress.jpg", mat, param);

Стандартно значение сжатия 95 (вроде бы, специально не проверял)

READ ALSO
Непрерывное соединение с сервером

Непрерывное соединение с сервером

Есть сервер, к которому мое приложение подключается посредством SocketНужно держать постоянный коннект, чтобы обходить ситуации, когда пропадает...

290
Ответ “Да или ”Нет" для продолжения игры

Ответ “Да или ”Нет" для продолжения игры

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

235
Ограничение размера Dialog

Ограничение размера Dialog

У меня есть диалоговое окно,в котором содержится RecyclerViewПри добавлении элементов окно становится выше

183
Bluetooth в Java

Bluetooth в Java

Скажите пожалуйста, возможно ли с помощью Java написать программу под Windows для работы с BluetoothЕсли да, то хотелось бы примеры программ, ссылки,...

200