Формула аддитивного смешивания цветов

 
 
 
Сообщения:13
У меня есть класс Sprite(код ниже) и мне нужно создать функцию, которая смешивает цвета пикселей картинки с заданным цветом, подскажите, пожалуйста, как такое сделать.
Sprite:
package LuckyEngine.Main;

import javax.imageio.ImageIO;
import java.awt.*;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;

public class Sprite {

    private BufferedImage image;

    public Sprite(String path){

        try {

            image = ImageIO.read(new File(path));

        } catch (IOException e){

            System.out.println(e.getMessage());

        }

    }

    // эта функция полностью перекрашивает картинку в один цвет
    void setColor(Color color) {

        for (int x = 0; x < image.getWidth(); x++){

            for (int y = 0; y < image.getHeight(); y++){

                image.setRGB(x, y, color.getRGB());

            }

        }

    }

    BufferedImage getImage(){

        return image;

    }

}
Изменен:10 фев 2019 13:01
 
 
Сообщения:13
У меня почти получилось, но почему-то когда он смешивает цвета, оно становится слегка белым, как это исправить?
Код:
package LuckyEngine.Main;

import javax.imageio.ImageIO;
import java.awt.*;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;

public class Sprite {

    private BufferedImage image;

    private Color[][] defaultColor;

    public Sprite(String path){

        try {

            image = ImageIO.read(new File(path));

        } catch (IOException e){

            System.out.println(e.getMessage());

        }

        defaultColor = new Color[image.getWidth()][image.getHeight()];
        for (int x = 0; x < image.getWidth(); x ++){

            for (int y = 0; y < image.getHeight(); y ++) {

                defaultColor[x][y] = new Color(image.getRGB(x, y));

            }

        }

    }

    void setColor(Color color) {

        if (color != Color.white) {

            for (int x = 0; x < image.getWidth(); x++) {

                for (int y = 0; y < image.getHeight(); y++) {

                    if (image.getRGB(x, y) != 0) {

                        Color coloredPix = new Color((defaultColor[x][y].getRed() + color.getRed()) / 2,
                                (defaultColor[x][y].getGreen() + color.getGreen()) / 2,
                                (defaultColor[x][y].getBlue() + color.getBlue()) / 2);

                        image.setRGB(x, y, coloredPix.getRGB());

                    }

                }

            }

        }

    }

    BufferedImage getImage(){

        return image;

    }

}
 
 
Сообщения:1588
Вроде написано все верно, вы уверены, что усредненное значение это смешивание цветов?
 
 
Сообщения:301
Borundel:
У меня почти получилось, но почему-то когда он смешивает цвета, оно становится слегка белым, как это исправить?


Да, вы уже близко. Добро пожаловать в мир профессиональной графики! Ваша проблема в том, что в цветовом пространстве (Color Space) по-умолчанию (sRGB) компоненты и яркость действительно связаны нелинейно. Поэтому результат и получается ярче. Вам бы нужно получать компоненты цвета в линейном RGB (linear rgb), вот там все можно прекрасно складывать. Посмотрите документацию на java.awt.Color и java.awt.color.ColorSpace. Там достаточно методов и констант, чтобы выполнить все необходимые переводы в линейное пространство и обратно. В качестве бонуса в одной из документаций есть ссылка на то, почему вообще sRGB был так спроектирован.
 
Модераторы:frymock
Сейчас эту тему просматривают:Нет