我最近这样做是为了回答我的项目经理的问题。
将灰色转换为透明的功能是:
private Image TransformGrayToTransparency(BufferedImage image) { ImageFilter filter = new RGBImageFilter() { public final int filterRGB(int x, int y, int rgb) { return (rgb << 8) & 0xFF000000; } }; ImageProducer ip = new FilteredImageSource(image.getSource(), filter); return Toolkit.getDefaultToolkit().createImage(ip); }
实际上,它作用于灰度图像上,因此我只是将RGB分量(R一个)复制到alpha中,而丢弃了其他与我相同的分量。
您可以调整它以过滤特定的颜色,例如。平等或范围等的测试
。当然,数据的BufferedImage必须BufferedImage.TYPE_INT_ARGB类型。
我没有解决保存的问题,因为这很简单,但是我也可以添加此代码页。
[编辑]要将图像转换为BufferedImage:
BufferedImage dest = new BufferedImage( imageWidth, imageHeight, BufferedImage.TYPE_INT_ARGB);Graphics2D g2 = dest.createGraphics();g2.drawImage(image, 0, 0, null);g2.dispose();
[编辑2]我是在克里斯托弗发布完整的解决方案之后来到这里的,但是这是我的,我展示了如何使一系列颜色透明。可以改进,例如。而是使用HSB组件。
import java.awt.*;import java.awt.image.BufferedImage;import java.awt.image.FilteredImageSource;import java.awt.image.ImageFilter;import java.awt.image.ImageProducer;import java.awt.image.RGBImageFilter;import java.io.*;import javax.imageio.ImageIO;public class AddTransparency{ AddTransparency() throws IOException { String imagePath = "E:/documents/images/"; File inFile = new File(imagePath, "map.png"); BufferedImage image = ImageIO.read(inFile); Image transpImg1 = TransformGrayToTransparency(image); BufferedImage resultImage1 = ImageToBufferedImage(transpImg1, image.getWidth(), image.getHeight()); File outFile1 = new File(imagePath, "map_with_transparency1.png"); ImageIO.write(resultImage1, "PNG", outFile1); Image transpImg2 = TransformColorToTransparency(image, new Color(0, 50, 77), new Color(200, 200, 255)); BufferedImage resultImage2 = ImageToBufferedImage(transpImg2, image.getWidth(), image.getHeight()); File outFile2 = new File(imagePath, "map_with_transparency2.png"); ImageIO.write(resultImage2, "PNG", outFile2); } private Image TransformGrayToTransparency(BufferedImage image) { ImageFilter filter = new RGBImageFilter() { public final int filterRGB(int x, int y, int rgb) { return (rgb << 8) & 0xFF000000; } }; ImageProducer ip = new FilteredImageSource(image.getSource(), filter); return Toolkit.getDefaultToolkit().createImage(ip); } private Image TransformColorToTransparency(BufferedImage image, Color c1, Color c2) { // Primitive test, just an example final int r1 = c1.getRed(); final int g1 = c1.getGreen(); final int b1 = c1.getBlue(); final int r2 = c2.getRed(); final int g2 = c2.getGreen(); final int b2 = c2.getBlue(); ImageFilter filter = new RGBImageFilter() { public final int filterRGB(int x, int y, int rgb) { int r = (rgb & 0xFF0000) >> 16; int g = (rgb & 0xFF00) >> 8; int b = rgb & 0xFF; if (r >= r1 && r <= r2 && g >= g1 && g <= g2 && b >= b1 && b <= b2) { // Set fully transparent but keep color return rgb & 0xFFFFFF; } return rgb; } }; ImageProducer ip = new FilteredImageSource(image.getSource(), filter); return Toolkit.getDefaultToolkit().createImage(ip); } private BufferedImage ImageToBufferedImage(Image image, int width, int height) { BufferedImage dest = new BufferedImage( width, height, BufferedImage.TYPE_INT_ARGB); Graphics2D g2 = dest.createGraphics(); g2.drawImage(image, 0, 0, null); g2.dispose(); return dest; } public static void main(String[] args) throws IOException { AddTransparency at = new AddTransparency(); }}
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)