Java Преобразование изображения RGB в CMY - PullRequest
0 голосов
/ 22 декабря 2019

Я пытаюсь преобразовать изображение RGB (цветовое пространство) в изображение CMY (цветовое пространство). Я могу прочитать определенную (RGB) картинку, но моя проблема - написать или сохранить ее как картинку CMY. Изображение, которое я хочу преобразовать, выглядит следующим образом:

Изображение

Я написал следующий код:

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

import javax.imageio.ImageIO;

public class Aufgabe2c {

    public static void main(String[] args) {
        try {
            BufferedImage image = ImageIO.read(new File("blumen.bmp"));
            iterateThroughImage(image);

        } catch (IOException e) {
            e.printStackTrace();
        }

    }
    public static void iterateThroughImage(BufferedImage image) {
        int w = image.getWidth();
        int h = image.getHeight();
        System.out.println("width, height: " + w + ", " + h);

        for (int i = 0; i < h; i++) {
            for (int j = 0; j < w; j++) {
                System.out.println("x,y: " + j + ", " + i);
                int pixel = image.getRGB(j, i);
                getPixelARGB(pixel);
                System.out.println("");
            }
        }
    }

    public static void getPixelARGB(int pixel) {
        int alpha = (pixel >> 24) & 0xff;
        int red = (pixel >> 16) & 0xff;
        int green = (pixel >> 8) & 0xff;
        int blue = (pixel) & 0xff;
        System.out.println("argb: " + alpha + ", " + red + ", " + green + ", " + blue);
    }

    public static void convertRGBToCMY(int red, int green, int blue) {
        int cyan = 255 - red;
        int magenta =  255 - green;
        int yellow =  255 - blue;

        System.out.println("argb: "+ red + ", " + green + ", " + blue);
    }
}

Я получаюЗначение rgb как единственное int-значение в методе iterateThroughImage(BufferedImage image), где я храню его в переменной int pixel. Я получаю каждое значение красного, зеленого, синего и альфа-канала в методе getPixelARGB(int pixel).

Моя проблема на самом деле заключается в том, что я не знаю, как преобразовать конкретное конкретное изображение RGB в изображение CMY (цветового пространства).

Кстати: ссылка в ответе Пажамалаи G недоступна, поскольку страница «под» больше не доступна.

Я нашел довольно похожий вопрос, связанный с этимвопрос. Я постет там мой вопрос, но он был удален (по причинам, которые я не знаю). Это следующий вопрос: Написание Java-программы о RGB-CMY

Надеюсь, вы мне поможете.

1 Ответ

0 голосов
/ 22 декабря 2019

Вот, возможно, решение:

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

import javax.imageio.ImageIO;

public class Aufgabe2c {

    public static void main(String[] args) {
        try {
            BufferedImage image = ImageIO.read(new File("blumen.bmp"));
            iterateThroughImageToGetPixel(image);

        } catch (IOException e) {
            e.printStackTrace();
        }

    }
    public static void iterateThroughImageToGetPixel(BufferedImage image) {
        try {
            BufferedImage cmyImage = new BufferedImage(image.getWidth(), image.getHeight(), BufferedImage.TYPE_INT_RGB);

            System.out.println("width, height: " + image.getWidth() + ", " + image.getHeight());

            for (int column = 0; column < image.getHeight(); column++) {
                for (int row = 0; row < image.getWidth(); row++) {
                    System.out.println("x,y: " + row + ", " + column);
                    int pixel = image.getRGB(row, column);
//                  getPixelCMYValuesFromARGBValuesPerPixel(pixel).getRGB();
                    cmyImage.setRGB(row, column, getPixelCMYValuesFromARGBValuesPerPixel(image.getRGB(row, column)).getRGB());              

                    System.out.println("");
                    System.out.println("----------------------------------------------------------------------------");
                }
            }
            System.out.println("#####################################################");
            ImageIO.write(cmyImage, "bmp", new File("blumen_cmy.bmp") );
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } // Save as BMP
    }
    /*
     * Quelle: https://alvinalexander.com/blog/post/java/getting-rgb-values-for-each-pixel-in-image-using-java-bufferedi
     *         http://openbook.rheinwerk-verlag.de/javainsel9/javainsel_20_006.htm#mj4c12381d5bacf8fb6ee31448d26890bb
     */
    public static Color getPixelCMYValuesFromARGBValuesPerPixel(int pixel) {
        int alpha = (pixel >> 24) & 0xff;
        int red = (pixel >> 16) & 0xff;
        int green = (pixel >> 8) & 0xff;
        int blue = (pixel) & 0xff;

        System.out.println("argb: " + alpha + ", " + red + ", " + green + ", " + blue);

        return convertRGBToCMY(red, green, blue);
    }

    public static Color convertRGBToCMY(int red, int green, int blue) {
        int[] cmyArray = new int[3];

        //cyan
        int cyan = 255 - red;
        //magenta
        int magenta = 255 - green;
        //yellow
        int yellow = 255 - blue;
        return new Color(cyan, magenta, yellow);
    }
}

Надеюсь, это полезно

...