Добавление изображений JPG вместе с помощью Java - PullRequest
1 голос
/ 06 сентября 2011

Я пытаюсь взять несколько изображений JPG с одинаковыми размерами (30 * 30) и создать одно изображение.Например:

Image i = new BufferedImage(30, 30, BufferedImage.TYPE_INT_ARGB);
    Graphics2D g2 = (Graphics2D) i.getGraphics();
    if (this instanceof Node) {
        Image img;
        img = getImageFromFile(Node.icon);
        g2.drawImage(img, 0, 0, null);
    }
    if(this instanceof ForceNode){
        Image img;
        img = getImageFromFile(ForceNode.forceicon);
        g2.drawImage(img, 0, 0, null);
    }
    if(this instanceof TunnelNode){
        Image img;
        img = getImageFromFile(TunnelNode.tunnelicon);
        g2.drawImage(img, 0, 0, null);
    }
....

public Image getImageFromFile(File file) {
    Image image = null;
    try {
        image = ImageIO.read(file);
    } catch (IOException e) {
        Logger.getLogger(HackerGame.class.getName()).log(Level.SEVERE, null, e);
        return null;
    }
    return image;


}

Я понимаю, что есть некоторые проблемы с G2D, которые не являются строго необходимыми, но моя проблема заключается в следующем: эти изображения должны быть наложены друг на друга, чтобы создать целое изображение.Eash из изображений - это небольшие области всей картинки, которые нужно поместить поверх друг друга (не рядом), чтобы создать реальное изображение.Однако сейчас проблема заключается в том, что последний метод drawImage перезаписывает все изображение, поэтому у меня остается последний «бит изображения» вместо моего скомпилированного изображения.

Я подозреваю, что это потому, что белые области моегокартинки не рассматриваются как прозрачные, но как мне обойти это.У меня почти нет опыта работы с кодировкой изображений, так что я вроде как методом проб и ошибок :) В любом случае ПОМОГИТЕ!

Решение:

public void generateIcon() {
    BufferedImage i = new BufferedImage(30, 30, BufferedImage.TYPE_INT_ARGB);
    if (this instanceof Node) {
        i = compileImages(i, Node.icon);
    }
    if(this instanceof ForceNode){
        i = compileImages(i, ForceNode.forceicon);
    }
    if(this instanceof TunnelNode){
        i = compileImages(i, TunnelNode.tunnelicon);
    }
    if (this instanceof EntranceNode) {
        i = compileImages(i, EntranceNode.entranceicon);
    }
    if (this instanceof NetworkNode) {
        i = compileImages(i, NetworkNode.networkicon);
    }
    if(this instanceof DataNode){
        i = compileImages(i, DataNode.dataicon);
    }

    //if(this instanceof )


    nodeicon = i;
}

public BufferedImage compileImages(BufferedImage image, File f) {
    BufferedImage im = null;
    try {
        im = ImageIO.read(f);
        for(int i = 0 ; i<image.getWidth();i++){
            for(int j = 0 ; j<image.getHeight();j++){
                int rgb = im.getRGB(i, j);
                //System.out.println(i + " " + j + " " + rgb);
                if(!(rgb < 1 && rgb > -2)){
                    image.setRGB(i, j, rgb);
                    //System.out.println("Printing " + i + " " + j + " " + rgb);
                }
            }
        }
    } catch (IOException e) {
        Logger.getLogger(HackerGame.class.getName()).log(Level.SEVERE, null, e);
        return null;
    }
    return image;


}

1 Ответ

1 голос
/ 06 сентября 2011

Итерирование пикселей исходных изображений. Если они , а не белого (используйте getRGB(x,y) для их сравнения), запишите их в конечное изображение.

...