Есть 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(), оно заранее ужимает.
Кодек, который сохраняет 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 (вроде бы, специально не проверял)
Как развивать веб-проекты в 2026 году: технологии, контент E-E-A-T и факторы доверия
Современные инструменты для криптотрейдинга: как технологии помогают принимать решения
Апостиль в Лос-Анджелесе без лишних нервов и бумажной волокиты
Основные этапы разработки сайта для стоматологической клиники