Создание составного изображения из двух исходных png в Groovy - PullRequest
1 голос
/ 24 июня 2011

Я видел некоторый код Groovy, который позволяет вам комбинировать изображения и текст, но не изображения и изображения ...

По сути, мне нужно наложить символы в определенных координатах на картах: у меня есть несколько карт и символов в виде файлов .png. Я могу сделать координаты calcs без проблем, поэтому проблема скорее в случае, учитывая два прозрачных PNG, как мне объединить их без потери прозрачности? (Возможно, карта и символ должны сохранить свою прозрачность).

В идеале мне нужна функция, что-то вроде

combinePngImage(background_src, foreground_src, foreground_x, foreground_y)

, которая будет возвращать png-комбинацию двух, учитывая верхнюю левую и верхнюю правую координаты изображения переднего плана.

[Справочная информация. У меня есть несколько карт и символов в виде файлов .png, хранящихся в полях контейнера в FileMaker, которые мне нужно объединить в решении FileMaker. Я попытался сделать это, используя ImageMagick и командную строку, но внезапно меня поразило, что это может быть сделано с помощью ScriptMaster, который использует Groovy для создания внешних функций. ]

Любые указатели с благодарностью получены!

Ответы [ 2 ]

1 голос
/ 24 июня 2011

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

Учитывая вызов 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;
0 голосов
/ 24 июня 2011

Вместо использования командной строки ImageMagick вы можете попробовать использовать Im4java , чистый Java ImageMagick API.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...