【问题标题】:How do I stop java from setting my BufferedImage to fully transparent?如何阻止 java 将我的 BufferedImage 设置为完全透明?
【发布时间】:2014-10-02 21:14:50
【问题描述】:

我正在尝试用java创建一个图像编辑器,但是当我运行代码时,输​​出的图像是完全透明的。

这是我的 Main.java 代码:

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

import javax.imageio.ImageIO;

public class Main {

    public static void main(String[] args) {

        BufferedImage image = null;
        try {
            image = ImageIO.read(new File("strawberry.png"));
        } catch (IOException e) {
            System.out.println(e);
        }

        new Negative(image);

        File outputfile = new File("saved.png");

        try {
            ImageIO.write(image, "png", outputfile);
        } catch (IOException e) {
            System.out.println(e);
        }

    }

}

这是我的 Negative.java 代码:

import java.awt.image.BufferedImage;

public class Negative {

    public Negative(BufferedImage img) {

          for (int x = 0; x < img.getWidth(); ++x) {
                for (int y = 0; y < img.getHeight(); ++y) {

                    int rgb = img.getRGB(x, y);
                    int r = (rgb >> 16) & 0xFF;
                    int g = (rgb >> 8) & 0xFF;
                    int b = (rgb & 0xFF);

                    r = 255 - r;
                    g = 255 - g;
                    b = 255 - b;

                    int newColour = (r << 16) + (g << 8) + (b << 4); 
                    img.setRGB(x, y, newColour);

                }
          }

    }

}

如果有人能帮忙,我将不胜感激。

【问题讨论】:

  • 您创建了一个只有一个构造函数的类,并调用了该构造函数 Oo ... 只是将否定方法设为不需要类。与您的问题无关,但是,修复它跨度>

标签: java transparency bufferedimage


【解决方案1】:

问题

他们所说的 RGB 颜色实际上是 ARGB,每个 8 位。 Alpha 以最高 8 位给出,0 表示透明,255 表示完全不透明。

这就是TYPE_INT_ARGBBufferedImage.setRGB() 的javadoc 中的含义:

假定像素位于默认的 RGB 颜色模型、TYPE_INT_ARGB 和默认的 sRGB 颜色空间中。

解决方案

对于完全不透明的图像,添加 255 alpha 值:

int newColour = (0xff << 24) + (r << 16) + (g << 8) + (b << 4); 

或者,如果您也提取图像的原始 alpha,则可以获取它:

int rgb = img.getRGB(x, y);
int alpha = (rgb >>> 24);
int r = (rgb >> 16) & 0xFF;
int g = (rgb >> 8) & 0xFF;
int b = (rgb & 0xFF);

int newColour = (alpha << 24) + (r << 16) + (g << 8) + (b << 4);

【讨论】:

  • 谢谢!这很有帮助!
【解决方案2】:

颜色还有一个组成部分:Alpha 通道。它存储在一个数字的 24-31 位中。如果设置为 0,则图像是透明的。所以你需要将 newColor 的 24-31 位设置为 1 使其不透明。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-09-17
    • 2014-12-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-10-04
    相关资源
    最近更新 更多