1

我正在考虑在 Java 中做两件事的最佳方法:

  1. 合并两个图像,一个在 .PNG 中的背景,另一个在 .GIF 或 .PNG 中(具有透明度并且与第一个重叠);
  2. 将合并的图像转换为 .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

4 回答 4

4

不确定您的应用程序,但如果这是基于服务器的高性能东西,那么使用ImageMagick的结果要比使用 Java 的图像库好得多。

于 2010-02-08T16:21:46.133 回答
2

也许这个链接可以帮助?

在组件上渲染图像和绘制图像是一样的。

您必须创建一个方法 createImage(),而不是在 paint 方法中绘画。链接中提供的示例可以这样修改:(在 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;
}
于 2010-02-08T16:23:54.023 回答
1

如果您不介意添加外部依赖项,可以使用JMagick 绑定到 ImageMagick。

于 2010-02-08T16:40:22.353 回答
1

绝对检查JAI ( api )。

它将允许您加载和存储以基本上任何已知格式(包括 png 和 gif)编码的图像,并允许您在加载图像后有效地对其进行操作。

特别是您可能正在寻找类似CompositeDescriptor的东西。

于 2010-02-08T16:43:13.167 回答