📜  Java中的图像处理——彩色图像到棕褐色图像的转换

📅  最后修改于: 2022-05-13 01:55:11.761000             🧑  作者: Mango

Java中的图像处理——彩色图像到棕褐色图像的转换

先决条件:

  • Java中的图像处理——读写
  • Java中的图像处理——获取和设置像素
  • Java中的图像处理——彩色图像到灰度图像的转换
  • Java中的图像处理——彩色图像到负图像的转换
  • Java中的图像处理——彩色到红绿蓝图像的转换

在这组中,我们将把彩色图像转换为棕褐色图像。在棕褐色图像中,图像的 Alpha 分量将与原始图像相同(因为 Alpha 分量表示透明度)。尽管如此,RGB 还是会发生变化,这将通过以下公式计算。

newRed = 0.393*R + 0.769*G + 0.189*B
newGreen = 0.349*R + 0.686*G + 0.168*B
newBlue = 0.272*R + 0.534*G + 0.131*B

如果这些输出值中的任何一个大于 255,只需将其设置为 255。这些特定值是 Microsoft 推荐的棕褐色调值。

算法:

  1. 获取像素的 RGB 值。
  2. 使用上式计算newRed、new green、newBlue(取整数值)
  3. 根据以下条件设置像素的新 RGB 值:
    • 如果 newRed > 255 则 R = 255 否则 R = newRed
    • 如果 newGreen > 255 则 G = 255 否则 G = newGreen
    • 如果 newBlue > 255 那么 B = 255 否则 B = newBlue
  4. 将 R、G 和 B 的值替换为我们为像素计算的新值。
  5. 对图像的每个像素重复步骤 1 到步骤 4。

执行:

Java
// Java program to demonstrate
// colored to sepia conversion
  
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import javax.imageio.ImageIO;
  
public class Sepia {
    public static void main(String args[])
        throws IOException
    {
        BufferedImage img = null;
        File f = null;
  
        // read image
        try {
            f = new File(
                "C:/Users/hp/Desktop/Image Processing in Java/gfg-logo.png");
            img = ImageIO.read(f);
        }
        catch (IOException e) {
            System.out.println(e);
        }
  
        // get width and height of the image
        int width = img.getWidth();
        int height = img.getHeight();
  
        // convert to sepia
        for (int y = 0; y < height; y++) {
            for (int x = 0; x < width; x++) {
                int p = img.getRGB(x, y);
  
                int a = (p >> 24) & 0xff;
                int R = (p >> 16) & 0xff;
                int G = (p >> 8) & 0xff;
                int B = p & 0xff;
  
                // calculate newRed, newGreen, newBlue
                int newRed = (int)(0.393 * R + 0.769 * G
                                   + 0.189 * B);
                int newGreen = (int)(0.349 * R + 0.686 * G
                                     + 0.168 * B);
                int newBlue = (int)(0.272 * R + 0.534 * G
                                    + 0.131 * B);
  
                // check condition
                if (newRed > 255)
                    R = 255;
                else
                    R = newRed;
  
                if (newGreen > 255)
                    G = 255;
                else
                    G = newGreen;
  
                if (newBlue > 255)
                    B = 255;
                else
                    B = newBlue;
  
                // set new RGB value
                p = (a << 24) | (R << 16) | (G << 8) | B;
  
                img.setRGB(x, y, p);
            }
        }
  
        // write image
        try {
            f = new File(
                "C:/Users/hp/Desktop/Image Processing in Java/GFG.png");
            ImageIO.write(img, "png", f);
        }
        catch (IOException e) {
            System.out.println(e);
        }
    }
}


输出: