从Groovy中的两个源png创建合成图像

时间:2011-06-24 05:06:28

标签: image-processing groovy png transparency filemaker

我见过一些Groovy代码可以让你梳理图像和文字,但不能用图像和图像...

基本上,我需要在地图上的某些坐标处叠加符号:我有一些地图和符号作为.png文件。我可以做坐标计算没问题,所以问题更多的是,给定两个透明的png如何在不失透明度的情况下组合它们? (地图和符号都可能需要保持透明度。)

理想情况下我需要一个功能,比如

combinePngImage(background_src, foreground_src, foreground_x, foreground_y)

如果给出前景图像的左上角,右上角坐标,则会返回两者的png组合。

[背景:我有一些地图和符号作为.png文件存储在FileMaker的容器字段中,我需要在FileMaker解决方案中组合。我已经尝试使用ImageMagick和命令行来查看它,但它突然让我觉得这可能是使用ScriptMaster完成的,它使用Groovy创建外部函数。 ]

任何指针都感激不尽!

2 个答案:

答案 0 :(得分:1)

好的,这是值得的 - 这里有一些鹅卵石拼凑的食谱片段似乎可以完成这项任务 - 任何关于(差)编码风格的评论都会得到很好的接受。

给定一个ScriptMaster调用

combineImage ( backgroundImg ; foregroundImg ; x ; y )

所需的代码是:

import javax.imageio.ImageIO;
import java.awt.*;
import java.awt.image.BufferedImage;
import java.io.File;
import java.net.URL;

// get container data
InputStream bgImgContainer

try{
  bgImgContainer = fmpro.getContainerStream(backgroundImg)
}catch(e){
  throw new Exception('Could not get data from background image container (make sure container field name is passed as text)')
}

// test if container field is empty
if( bgImgContainer == null ) {
  throw new Exception('Background image container field is empty')
}

bgImgName = fmpro.getContainerFileName(backgroundImg);

InputStream fgImgContainer

try{                                         
  fgImgContainer = fmpro.getContainerStream(foregroundImg)
}catch(e){
  throw new Exception('Could not get data from foreground image container (make sure container field name is passed as text)')
}

// test if container field is empty
if( fgImgContainer == null ) {
  throw new Exception('Foreground image container field is empty')
}

fgImgName = fmpro.getContainerFileName(foregroundImg);

int xCoord = Integer.parseInt(x);
int yCoord = Integer.parseInt(y);

// load image from container data
BufferedImage result = ImageIO.read(bgImgContainer);
BufferedImage overlay = ImageIO.read(fgImgContainer);

int fgWidth  = overlay.getWidth(null);
int fgHeight = overlay.getHeight(null);

Graphics2D graphics = result.createGraphics();

// overlay the foreground at given coordinates and actual size
graphics.drawImage(overlay, xCoord, yCoord, fgWidth, fgHeight, null);

graphics.dispose();

File output = File.createTempFile(bgImgName, ".png");
ImageIO.write(result, "png", output);
return output;

答案 1 :(得分:0)

您可以尝试使用纯{Java ImageMagick API} Im4java,而不是使用ImageMagick命令行。