Обработка изображений в Java
Я думаю о лучшем способе сделать две вещи в Java:
- объединить два изображения: фоновое в.PNG, а другое в.GIF или.PNG (имеет прозрачность и перекрывает первое);
- преобразовать объединенное изображение в формат.GIF (с прозрачностью).
Я не хочу отображать их, просто для обработки изображений в классе Java и записи результирующего изображения в файл.
Может кто-нибудь мне помочь? Какой лучший способ сделать это? Спасибо!
РЕДАКТИРОВАТЬ: Спасибо всем за предложения! Это было то, что я в конечном итоге использовал! Довольно просто!
BufferedImage background = ImageIO.read(new File("image.jpg"));
WritableRaster raster = background.getRaster();
BufferedImage layer = ImageIO.read(new File("overlay.png"));
Graphics2D g2d = (Graphics2D)background.getGraphics();
g2d.drawImage(layer,72,80,null);
Что касается второй проблемы, я все еще не могу сохранить это с расширением.gif с прозрачностью. это
ImageIO.write(bufferedImage,"gif",file);
создает файл изображения.gif, но теряет прозрачность! Кто-нибудь знает, как я могу это сделать? JAI также не имеет GIF-кодировщик. Спасибо.
4 ответа
Не уверен в вашем приложении, но если это высокопроизводительные серверные приложения, у меня были гораздо лучшие результаты при использовании ImageMagick, чем при использовании библиотек изображений Java.
Может быть, эта ссылка может помочь?
Это то же самое, что визуализировать изображение на компоненте и нарисовать изображение.
Вместо рисования в методе рисования вам нужно будет создать метод createImage(). Пример, приведенный в ссылке, можно изменить следующим образом: (в Java рисование на компоненте, на изображении, на выводе на принтер... везде одинаково. Вы получаете графику, вы рисуете).
public BufferedImage createImage(Graphics g) {
BufferedImage image - new BufferedImage(...);
Graphics2D g2 = image.getGraphics();
Point2D center = new Point2D.Float(image.getHeight( ) / 2, image.getWidth( ) / 2);
AffineTransform at = AffineTransform.getTranslateInstance(center.getX( ) - (bi2.getWidth( ) / 2), center.getY( ) - (bi2.getHeight( ) / 2));
g2.transform(at);
g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
g2.drawImage(bi2, 0, 0, null);
Composite c = AlphaComposite.getInstance(AlphaComposite.SRC_OVER, .35f);
g2.setComposite(c);
at = AffineTransform.getTranslateInstance(center.getX( ) - (bi1.getWidth( ) / 2), center.getY( ) - (bi1.getHeight( ) / 2));
g2.setTransform(at);
g2.drawImage(bi1, 0, 0, null);
return image;
}
Если вы не возражаете против добавления внешней зависимости, вы можете использовать привязки JMagick к ImageMagick.
Определенно проверить JAI ( API).
Это позволит вам загружать и хранить изображения, которые были закодированы практически в любом известном формате (включая png и gif), и позволит вам эффективно работать с изображениями после их загрузки.
В частности, вы, вероятно, ищете что-то вроде CompositeDescriptor.