2

次のコードを使用して、画像に対してさまざまな操作を実行するプログラムを作成しています。

import java.awt.Desktop;
import java.awt.Graphics;
import java.awt.image.BufferedImage;
import java.awt.image.WritableRaster;
import java.io.BufferedReader;
import java.io.File;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.logging.Level;
import java.util.logging.Logger;

import javax.imageio.ImageIO;

public class BrightnessContrast {
    public static void main(String[] args) throws IOException {
        // TODO Auto-generated method stub
        int i, j, choice = 1;
        String imgName;
        boolean flag = true;

        String imagePath = "images/test.jpg";
        BufferedImage myImage = ImageIO.read(new File(imagePath));
        int height = myImage.getHeight();
        int width = myImage.getWidth();
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        final BufferedImage greyImage = new BufferedImage(width, height,BufferedImage.TYPE_BYTE_GRAY);
        Graphics grp = greyImage.getGraphics();
        grp.drawImage(myImage, 0, 0, null);
        File f2 = new File("images/BrightnessContrastTestInput.jpg");
        try {
            ImageIO.write(greyImage, "JPG", f2);
        } catch (IOException x) {
            x.printStackTrace();
        }

        while (flag == true) {
            System.out
                    .println(" 1.Brightness \n 2.Contrast \n 3.EXIT!");
            choice = Integer.parseInt(br.readLine());

            switch (choice) {
            case 1:
                //increase brightness

            case 2:
                //increase contrast
            case 3:
                flag = false;
                break;
            default:
                System.out.println("Invalid Option. Please try again.");
                break;
            }
        }
    }

    public static void ImageOperation(BufferedImage greyImage) {

        WritableRaster  myRaster = greyImage.getRaster();

        for (j = 0; j < greyImage.getHeight(); j++) {
            for (i = 0; i < greyImage.getWidth(); i++) {
                //some logic to increase contrast and brightness 
            }
        }

        File f = new File("images/"+imgName);
        try {
            ImageIO.write(greyImage, "JPG", f);
        } catch (IOException x) {
            x.printStackTrace();
        }
    }
    }

}

すべての操作はメソッドの書き込み可能なラスター オブジェクトmyRasterで行われ、BufferedImage オブジェクトを使用して作成されます。ImageOperationmyRastergreyImage

ここで、最初の実行で(たとえば)画像のコントラストを特定の係数だけ増加させると、適切な結果が得られます.2回目にまったく同じ量のコントラストを適用すると、以前に強化された画像でその操作が行われます、元のものではないため、2回目にはコントラストが高くなります。

私の質問は、 BufferedImage オブジェクトは、greyImageコントラストを上げるたびに更新されmyRasterますか?

4

1 に答える 1

3

のソースを見るとBufferedImagegetRaster()バッファリングされたイメージ内の基礎となるラスター オブジェクトへの参照が返されます。したがって、ラスターを変更すると、効果的に画像が変更されたことになります。

元のイメージのコピーを作成してから、そのコピーを操作したい場合があります。これにより、オリジナルが保持されます。

于 2012-09-03T13:19:22.293 に答える