Обработка изображений в Java - PullRequest
1 голос
/ 08 февраля 2010

Я думаю о лучшем способе сделать две вещи в Java:

  1. объединить два изображения: фоновое в .PNG, а другое в .GIF или .PNG (имеет прозрачность и перекрывает первое);
  2. преобразовать объединенное изображение в формат .GIF (с прозрачностью).

Я не хочу отображать их, просто для обработки изображений в классе java и записи результирующего изображения в файл.

Кто-нибудь может мне помочь? Какой лучший способ сделать это? Спасибо!

EDIT: Спасибо всем за предложения! Это было то, что я в конечном итоге использовал! Довольно просто!

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 ]

4 голосов
/ 08 февраля 2010

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

2 голосов
/ 08 февраля 2010

Может быть эта ссылка может помочь?

То же самое, что сделать изображение на компоненте и нарисовать изображение.

Вместо рисования в методе рисования вам придется создать метод 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;
}
1 голос
/ 08 февраля 2010

Определенно проверить JAI ( API ).

Это позволит вам загружать и хранить изображения, которые были закодированы практически в любом известном формате (включая png и gif), и позволит вам эффективно работать с изображениями после их загрузки.

В частности, вы, вероятно, ищете что-то вроде CompositeDescriptor .

1 голос
/ 08 февраля 2010

Если вы не возражаете добавить внешнюю зависимость, вы можете использовать привязки JMagick к ImageMagick.

...