如何在java中更改图像的不透明度以将其放在另一个图像上?

时间:2015-09-24 22:42:18

标签: java image png

所以我有一张地图的图像。我有一个叠加图像,我想放置在地图上,这样你可以主要看到地图,但也可以看到叠加。然而,在逐个像素的基础上,我不知道如何评估结果图片的颜色,因为它是地图和叠加的混合。为了便于说明,我制作了以下图片: sample image

你可以看到胡萝卜主要,但你也可以看到唐纳德特朗普超过胡萝卜。因此,考虑到整个图像的每个像素的RGB值(或HSV,无论哪个更有用),我如何以这样的方式将它们组合起来,我可以看到它们?

1 个答案:

答案 0 :(得分:0)

我最终解决这个问题的方法是通过http://www.rapidtables.com/convert/color/rgb-to-hsv.htm上的公式将每个像素的RGB值转换为HSV颜色。然后我将每种颜色的Hue,Saturation和Value值与我想要的任何比例相结合,并将该HSV值转换回RGB。我发现如果我想比另一个更清楚地看到一个对象,你应该更多地保留该对象的Value值。因此,在我的项目中,我希望看到的地图多于叠加层,我将最终的Value值与原始地图图像的值相匹配。

这是我的HSV颜色代码。

public static class HSVColor {
    double[] HSV = new double[3];
    int[] RGB = new int[3];
    int RGBV;
    //Constructor using the formula from http://www.rapidtables.com/convert/color/rgb-to-hsv.htm
    public HSVColor(int R, int G, int B) {
        RGB[0] = R;
        RGB[1] = G;
        RGB[2] = B;
        RGBV = (256 * 256) * R + 256 * G + B;
        double r = (double) R / 255.0;
        double g = (double) G / 255.0;
        double b = (double) B / 255.0;
        double min = Math.min(r, Math.min(g, b));
        double max = Math.max(r, Math.max(g, b));
        double delta = max - min;
        if (r == max) {
            HSV[0] = 60 * (((g - b) / delta) % 6);
        } else if (g == max) {
            HSV[0] = 60 * (((b - r) / delta) + 2);
        } else if (b == max) {
            HSV[0] = 60 * (((r - g) / delta) + 4);
        } else {
            HSV[0] = 0;
        }
        if (max == 0) {
            HSV[1] = 0;
        } else {
            HSV[1] = delta / max;
        }
        HSV[2] = max;
    }
    //Constructor using the formula from http://www.rapidtables.com/convert/color/hsv-to-rgb.htm
    public HSVColor(double H, double S, double V) {
        HSV[0] = H;
        HSV[1] = S;
        HSV[2] = V;
        double C = V * S;
        double X = C * (1 - Math.abs(((H / 60) % 2) - 1));
        double m = V - C;
        double r;
        double g;
        double b;
        if (H < 60) {
            r = C;
            g = X;
            b = 0;
        } else if (H < 120) {
            r = X;
            g = C;
            b = 0;
        } else if (H < 180) {
            r = 0;
            g = C;
            b = X;
        } else if (H < 240) {
            r = 0;
            g = X;
            b = C;
        } else if (H < 300) {
            r = X;
            g = 0;
            b = C;
        } else {
            r = C;
            g = 0;
            b = X;
        }
        RGB[0] = (int) ((r + m) * 255);
        RGB[1] = (int) ((g + m) * 255);
        RGB[2] = (int) ((b + m) * 255);
        RGBV = (256 * 256) * RGB[0] + 256 * RGB[1] + RGB[2];
    }
}