Наложение изображений

#java #image-processing

Вопрос:

[![Редактировать: я добавил фотографию ошибки, которую получаю.][1]][1]Я все еще очень новичок в программировании, и я столкнулся с проблемой с кодом, с которым, я надеюсь, кто-нибудь сможет мне помочь. Я нашел приведенный ниже java-код для наложения и сравнения пикселей двух изображений на онлайн-форуме. Когда я пытаюсь скомпилировать код, я получаю синтаксическую ошибку. Надеюсь, вы сможете помочь мне найти ошибку. Заранее спасибо.

 package stackexchange;

import java.awt.Color;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;

import javax.imageio.ImageIO;

public class PictureOverlayTest {
    /*
     * Four variables, three for the wanted BufferedImages, one String for the
     * Path of the third Image, which does not already exist.
     */`

    private BufferedImage image1;
    private BufferedImage image2;
    private BufferedImage image3;

    private String pathImage3;

    public PictureOverlayTest(String filePathAndName1, String filePathAndName2,
            String filePathAndName3) throws IOException {
        /*
         * Constructor in order to keep this method reusable and clean. Needs
         * three Strings. The paths and Filenames of all three images. Image 1
         * and 2 should exist already, Image 3 will be created if all
         * requirements are met. Constructor creates the first two buffered
         * images, sets all needed variables and starts the checkAndCompare()
         * method
         */

        File file = new File(filePathAndName1);
        this.image1 = ImageIO.read(file);

        file = new File(filePathAndName2);
        this.image2 = ImageIO.read(file);

        this.pathImage3 = filePathAndName3;
        checkAndCompare();
    }

    private void checkAndCompare() throws IOException {
        /*
         * This function creates the Color blue, compares the sizes of both
         * pictures and if they are the same, creates a third image. Then it
         * loops through the two images and compares each pixel. If the pixels
         * are the same, the third image gets a blue pixel at that point
         */

        Color blue = Color.blue;

        if (image1.getHeight() == image2.getHeight()
                amp;amp; image1.getWidth() == image2.getWidth()) {

            image3 = new BufferedImage(image1.getWidth(), image1.getHeight(),
                    image1.getType());
            for (int y = 0; y < image1.getHeight(); y  ) {
                for (int x = 0; x < image1.getWidth(); x  ) {

                    int colorImage1 = image1.getRGB(x, y);
                    int colorImage2 = image2.getRGB(x, y);

                    if (colorImage1 == colorImage2) {

                        image3.setRGB(x, y, blue.getRGB());

                    } else {

                        // Whatever Color you want. By default it is black.

                    }

                }
            }
            savePicture3();
            System.out.println("Message: Image comparison is done");

        } else {

            System.out.println("Error: Image dimensions do not match");

        }

    }

    private void savePicture3() throws IOException {
        /*
         * This method saves the created Image into a file onto your computer.
         * The if() statement is used to check if the file was successfully
         * created, in order to avoid unwanted errors. Keep in mind, that you
         * have to change the "bmp" in ImageIO.write() to whatever format you
         * actually want
         */

        File file = new File(pathImage3);
        if (file.createNewFile()) {
            ImageIO.write(image3, "bmp", file);
        }
    }

}

package stackexchange;

import java.io.IOException;

public class Main {

    public static void main(String[] args) {
        // TODO Auto-generated method stub

        try {
            PictureOverlayTest test = new PictureOverlayTest(
                    "H:\stackexchange\file1.bmp",
                    "H:\stackexchange\file2.bmp",
                    "H:\stackexchange\file3.bmp");
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }

}


  [1]: https://i.stack.imgur.com/OYdeO.png
 

Комментарии:

1. Это работает на меня. На самом деле, это очень элегантный и хорошо написанный класс, он отлично работает. Какие ошибки вы получаете?

2. Ваша проблема может заключаться в том , что PictureOverlayTest код должен быть помещен в другой файл класса java с именем PictureOverlayTest , а Main часть кода должна быть помещена в файл класса с именем Main , и оба файла должны находиться в пакете с именем stackexchange . Если это не так, то вам нужно будет изменить код, чтобы он был нацелен на правильный пакет и имел имя класса.

3. @davidalayachew, код вообще не компилируется, в нем просто говорится о синтаксической ошибке. Как уже говорилось, я все еще новичок, и я знаю, что это, вероятно, небольшая вещь, которую следует изменить, но я просто не могу понять это.

4. Вот какие ошибки кода я получаю: postimg.cc/gallery/fJZW2k5

5. @Рабитаха, я вижу. Я согласен с sorifiendом — я бы сначала попытался разделить 2 класса java на 2 отдельных файла вместо одного большого — хорошими именами могут быть «PictureOverlayTest» и «Main». Затем нажмите ctrl f на этом символе —> ‘ > Давайте посмотрим, поможет ли это.