Я сжимаю изображение, выполняющее сжатие Jpeg на Java, а затем изменяя его размер перед сохранением. Я сохраняю высоту хранения как 480
и вычисляет height
на основе соотношения сторон, поэтому сохранить исходное соотношение height:width
.Java: getHeight() на BufferedImage возвращает ширину изображения, а getWidth() возвращает высоту изображения
Это код, я использую
String inputImagePath = "1.JPG";
String outputImagePath = "Test Compression\\" + "1.JPG";
File imageFile = new File(inputImagePath);
File compressedImageFile = new File(outputImagePath);
int height = 640;
System.out.print("Conversion Start!\n");
if (imageFile != null)
{
InputStream is = new FileInputStream(imageFile);
OutputStream os = new FileOutputStream(compressedImageFile);
float quality = 0.2 f;
BufferedImage image = ImageIO.read(is);
double aspectRatio = (double) image.getWidth()/image.getHeight();
width = (int)(height * aspectRatio);
System.out.println("Original height = " + image.getHeight() + " Original width = " + image.getWidth());
System.out.println(" aspect ratio = " + aspectRatio);
System.out.println("height = " + height + " width = " + width + " aspect ratio = " + aspectRatio);
BufferedImage resizedImage = new BufferedImage(width, height, image.getType());
Graphics2D g = resizedImage.createGraphics();
g.drawImage(image, 0, 0, width, height, null);
g.dispose();
Iterator<ImageWriter> writers = ImageIO.getImageWritersByFormatName("jpg");
if (!writers.hasNext())
throw new IllegalStateException("No writers found");
ImageWriter writer = (ImageWriter) writers.next();
ImageOutputStream ios = ImageIO.createImageOutputStream(os);
writer.setOutput(ios);
ImageWriteParam param = writer.getDefaultWriteParam();
param.setCompressionMode(ImageWriteParam.MODE_EXPLICIT);
param.setCompressionQuality(quality);
writer.write(null, new IIOImage(resizedImage, null, null), param);
}
System.out.print("Conversion compete!");
Здесь метаданные изображения
Вот печатное содержание:
Original height = 1920 Original width = 2560
aspect ratio = 1.3333333333333333
height = 480 width = 640
aspect ratio = 1.3333333333333333
Я применил код другие изображения, которые на самом деле имели width > height
, и у меня было нет проблем с ротацией. Эта проблема rotaion возникает только для изображений с height > width
Насколько я знаю, в моем коде нет ничего плохого, я должен упустить что-то, связанное с функциями getHeight() и getWidth(). Пожалуйста, помогите мне
Могли бы вы обновить ваш образец кода с переменной высоты, а? Кажется, он отсутствует. – Flipbed
Я обновляю код переменной 'height'. Я получил желаемые результаты, используя [экстрактор метаданных] (https://github.com/drewnoakes/metadata-extractor), как предложил Сергей Гринев. Я разместил его ниже. –