gpt4 book ai didi

java - 如何在java中清除BufferedImage的像素?

转载 作者:行者123 更新时间:2023-12-02 05:32:59 25 4
gpt4 key购买 nike

在java中,我读取图像,然后遍历像素,如果其颜色距离<30,那么我想通过将其alpha更改为0来清除图像。这是我的代码:

但这不起作用。没有效果...

有人发现问题了吗?

谢谢

import java.awt.Color;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import javax.imageio.ImageIO;

public class Recognize {

public static void main(String args[]) throws IOException {

Path path = Paths.get("images/fish.png");
File file = path.toFile();

if (file.exists()) {
InputStream stream = Files.newInputStream(path);
BufferedImage bufferedImage = ImageIO.read(stream);

int width = bufferedImage.getWidth();
int height = bufferedImage.getHeight();

if (width > 0 && height > 0) {
int TLpixel = bufferedImage.getRGB(0, 0);
Color TLcolor = new Color(TLpixel);

for (int i = 0; i < width; i++) {
for (int j = 0; j < height; j++) {
int pixel = bufferedImage.getRGB(i, j);
Color color = new Color(pixel);
double distance = ColourDistance(TLcolor, color);
//System.out.println(distance);

if (distance < 30) {
int mc = (0 << 24) | 0x00ffffff;
int newcolor = pixel & mc;
bufferedImage.setRGB(i, j, newcolor);
}
}
}



File outputfile = new File("images/fish_new.png");
ImageIO.write(bufferedImage, "png", outputfile);

}
}
}

public static int[] printPixelARGB(int pixel) {
int alpha = (pixel >> 24) & 0xff;
int red = (pixel >> 16) & 0xff;
int green = (pixel >> 8) & 0xff;
int blue = (pixel) & 0xff;
return new int[] {red, green, blue, alpha};
}

public static double ColourDistance(Color c1, Color c2) {
double rmean = ( c1.getRed() + c2.getRed() )/2;
int r = c1.getRed() - c2.getRed();
int g = c1.getGreen() - c2.getGreen();
int b = c1.getBlue() - c2.getBlue();
double weightR = 2 + rmean/256;
double weightG = 4.0;
double weightB = 2 + (255-rmean)/256;
return Math.sqrt(weightR*r*r + weightG*g*g + weightB*b*b);
}
}

最佳答案

通过“清除”像素,您显然意味着“使像素透明”。

为了能够使像素透明,图像必须支持透明像素。 BufferedImage 是否支持透明像素取决于 BufferedImage类型。使用ImageIO加载BufferedImage后,您几乎不知道图像的类型。但是您可以通过将图像传递给如下方法来轻松地将图像转换为已知类型(支持透明度)的图像:

public static BufferedImage convertToARGB(BufferedImage image)
{
BufferedImage newImage = new BufferedImage(
image.getWidth(), image.getHeight(),
BufferedImage.TYPE_INT_ARGB);
Graphics2D g = newImage.createGraphics();
g.drawImage(image, 0, 0, null);
g.dispose();
return newImage;
}

关于java - 如何在java中清除BufferedImage的像素?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25346809/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com