Преобразование PNG в JPEG

Оператор == проверяет, указывают ли две ссылки на один и тот же объект или нет. .equals() проверьте фактическое содержимое строки (значение).

Обратите внимание, что метод .equals() принадлежит классу Object (суперкласс всех классов). Вам необходимо переопределить его в соответствии с вашим требованием к классу, но для String оно уже реализовано и проверяет, имеет ли две строки одно и то же значение.

  • Случай 1
    String s1 = "Stack Overflow";
    String s2 = "Stack Overflow";
    s1 == s2;      //true
    s1.equals(s2); //true
    
    Причина: строка литералы, созданные без нуля, хранятся в пуле строк в области перментонов кучи. Таким образом, оба s1 и s2 указывают на один и тот же объект в пуле.
  • Случай 2
    String s1 = new String("Stack Overflow");
    String s2 = new String("Stack Overflow");
    s1 == s2;      //false
    s1.equals(s2); //true
    
    Причина. Если вы создаете объект String с использованием ключевого слова new, ему выделяется отдельное пространство в куче.
13
задан Hannes Ovrén 22 February 2010 в 15:00
поделиться

3 ответа

у вас, вероятно, есть альфа-канал в png, от которого вам нужно избавиться, прежде чем пытаться записать jpg.

Создайте новый BufferedImage с типом TYPE_INT_RGB (не TYPE_INT_ARGB), а затем запишите исходное изображение (pngImage) на новое пустое изображение.

Примерно так (предупреждение, непроверенный код):

BufferedImage newImage = new BufferedImage( pngImage.getWidth(), pngImage.getHeight(), BufferedImage.TYPE_INT_RGB);
newImage.createGraphics().drawImage( pngImage, 0, 0, Color.BLACK, null);
19
ответ дан 1 December 2019 в 17:36
поделиться

Возможно, было бы проще использовать ImageIO для чтения PNG в BufferedImage и запишите изображение в формате JPEG.

Приложение: В этом подходе преобразование прозрачно обрабатывается писателем ImageTranscoder .

BufferedImage img = ImageIO.read(new File("image.png"));
ImageIO.write(img, "jpg", new File("image.jpg"));
24
ответ дан 1 December 2019 в 17:36
поделиться

Я полагаю, что JAI считывает изображение PNG с индексированной цветовой моделью и может записывать только 8-битные полутоновые или 24-битные цветные изображения как файлы JPEG.

Если вам не требуется использовать JAI для этой задачи, вы можете вместо этого использовать ImageIO:

ImageIO.write(ImageIO.read(new File("in.png")), "JPEG", new File("out.jpg"));
4
ответ дан 1 December 2019 в 17:36
поделиться
Другие вопросы по тегам:

Похожие вопросы: