转换JPG至PNG背景透明
问题描述:
虽然从JPG转换成PNG背景透明度的形象,我不希望在转换图像的虚线边框转换JPG至PNG背景透明
我变换后的图像(PNG)
我的源代码是
import java.awt.Color;
import java.awt.Graphics2D;
import java.awt.Image;
import java.awt.Toolkit;
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.File;
import javax.imageio.ImageIO;
public class DemoTransparent {
public static void main(String[] args) throws Exception {
URL url = new URL("http://i.stack.imgur.com/jEqbx.jpg");
Image image1 = ImageIO.read(url);
BufferedImage source = (BufferedImage) image1;
int color = source.getRGB(0, 0);
Image image = makeColorTransparent(source, new Color(color));
BufferedImage transparent = imageToBufferedImage(image);
File out = new File("D:\\Demo.png");
ImageIO.write(transparent, "PNG", out);
}
private static BufferedImage imageToBufferedImage(Image image) {
BufferedImage bufferedImage = new BufferedImage(image.getWidth(null), image.getHeight(null), BufferedImage.TYPE_4BYTE_ABGR_PRE);
Graphics2D g2 = bufferedImage.createGraphics();
g2.drawImage(image, 0, 0, null);
g2.dispose();
return bufferedImage;
}
public static Image makeColorTransparent(BufferedImage im, final Color color) {
ImageFilter filter = new RGBImageFilter() {
public int markerRGB = color.getRGB() | 0xFF000000;
public final int filterRGB(int x, int y, int rgb) {
if ((rgb | 0xFF000000) == markerRGB) {
return 0x00FFFFFF & rgb;
} else {
return rgb;
}
}
};
ImageProducer ip = new FilteredImageSource(im.getSource(), filter);
return Toolkit.getDefaultToolkit().createImage(ip);
}
}
我只想为png透明背景图片
答
通常我们做什么来提取颜色正好等于或几乎等于一个颜色是需要的阈值。
这里是你的代码的小修改:
// Take another parameter i.e. threshold
public static Image makeColorTransparent(BufferedImage im, final Color color, float threshold) {
ImageFilter filter = new RGBImageFilter() {
public float markerAlpha = color.getRGB() | 0xFF000000;
public final int filterRGB(int x, int y, int rgb) {
int currentAlpha = rgb | 0xFF000000; // just to make it clear, stored the value in new variable
float diff = Math.abs((currentAlpha - markerAlpha)/markerAlpha); // Now get the difference
if (diff <= threshold) { // Then compare that threshold value
return 0x00FFFFFF & rgb;
} else {
return rgb;
}
}
};
ImageProducer ip = new FilteredImageSource(im.getSource(), filter);
return Toolkit.getDefaultToolkit().createImage(ip);
}
然后调用功能makeColorTransparent(image, color, 0.05f);
但在你的形象问题。椭圆角上的像素颜色与椭圆内部的像素颜色(右下角)完全相同。所以算法也在消除这些像素。
可悲的是,你不能包括这些像素。我试图用不同的阈值来做到这一点。但是,无论是角落包括或椭圆形的一些像素被删除。你可以做的是使用0.05f
作为阈值,然后用手绘制你想要的区域(使用photoshop或任何简单的图像编辑器)。
这是非常可能的,未转换的领域是不是你正在做透明完全相同的颜色。即使它的数量很少(0xFE000000与0xFF000000),你的方法也会忽略像素。 – Thevenin