我正在尝试使BufferedImage变灰(不将其转换为灰度,仅在顶部添加灰色调)。现在,我正在使用另一张图片,使其半透明,然后将其覆盖在原始图片上。这是我现在拥有的代码:

package com.mypkg;

import java.awt.AlphaComposite;
import java.awt.Graphics2D;
import java.awt.image.BufferedImage;
import java.io.File;
import java.net.URL;

import javax.imageio.ImageIO;

import org.imgscalr.Scalr;

public class Overlay {
    public static void main(String args[]){
        URL url = null;
        try{
            //The gray image used for overlay
            url = new URL("https://hoursofidleness.files.wordpress.com/2012/06/gray-card.jpg");
            BufferedImage img1 = ImageIO.read(url);

            //The original image which I want to gray out
            url = new URL("http://www.staywallpaper.com/wp-content/uploads/2016/01/Colorful-Wallpaper-HD-pictures-STAY015.jpg");
            BufferedImage img2 = ImageIO.read(url);
            BufferedImage reImg2 = Scalr.resize(img2, Scalr.Method.BALANCED, Scalr.Mode.FIT_EXACT, 150, 150);

            //Make the gray image, which is used as the overlay, translucent
            BufferedImage transparent = new BufferedImage(img1.getWidth(), img1.getHeight(),BufferedImage.TRANSLUCENT);
            Graphics2D g2d = transparent.createGraphics();
            g2d.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_OVER, (float) 0.50));
            g2d.drawImage(img1, null, 0, 0);
            g2d.dispose();
            BufferedImage reImg1 = Scalr.resize(transparent, Scalr.Method.BALANCED, Scalr.Mode.FIT_EXACT, 150, 150);

            //Merge both images
            BufferedImage result = new BufferedImage(150, 150, BufferedImage.TYPE_INT_ARGB);
            Graphics2D g = result.createGraphics();
            g.drawImage(reImg2, 0, 0, null);
            g.drawImage(reImg1, 0, 0, null);
            g.dispose();
            ImageIO.write(result,"png",new File("/result.png"));
        } catch(Exception e){
            e.printStackTrace();
        }
    }
}

是否有其他方法可以在不使用其他图像进行覆盖的情况下实现这一目标?我可以简单地在原始图像上添加灰色调吗?我尝试了很多其他帖子上看到的建议,但是都没有用。

谢谢。

最佳答案

您的方法主要做什么:

  • 加载灰色图像,其中所有像素均具有相同的灰色。
  • 创建一个新图像。
  • 在该图像上绘制灰色图像,使其半透明。
  • 在要变灰的图像上绘制半透明的灰图像。

  • 首先,不需要创建transparent图像。您可以直接在真实图像上使用合成绘图。

    其次,全灰色的图像与普通矩形没有什么不同,并且Graphics2D类具有fillRect方法,该方法绘制填充的矩形,可能比绘制图像快得多。

    因此,在将原始图像加载并缩放为reImg2之后,可以使用:
        Graphics2D g2d = reImg2.createGraphics();
        g2d.setColor(new Color(20,20,20,128));
        g2d.fillRect(0, 0, reImg2.getWidth(), reImg2.getHeight());
        g2d.dispose();
    

    就是这样,现在reImg2变暗了,您可以将其写入文件了。试一下这些值-将20s更改为较低的值以获得较深的灰色,或将较高的值(最大为255)更改为较浅的灰色。对于较灰暗的图像,将128(50%alpha)更改为较高的值,对于较灰暗的图像,更改为较低的值。

    07-24 22:15