PNG图片的截取问题

在缩放和截取图片的时候会发现在处理有透明效果的png图片是会出现意想不到的效果,莫名奇妙出来很多黑线。因为在很多的图片格式中是没有透明效果的,所以在解析的时候就会出错。

alpha通道是指一张图片的透明和半透明,比如一个使用16位元存储的位图,对于图形中的每一个像素而言,可能以一个5个位元表示红色,5个绿色,5个蓝色,最后一个位元是alpha。在这种情况下,它要么表示透明要么不是。如果是用32个位元存储的位图,红绿蓝分别用8位,剩下的8位用来表示不同程度的透明度。

在处理的时候,如果用下面的代码来实现一般图片的切割:

        Image image = bi.getScaledInstance(srcW, srcH, Image.SCALE_DEFAULT);
cropFilter = new CropImageFilter(x, y, width, height);
img = Toolkit.getDefaultToolkit().createImage(
new FilteredImageSource(image.getSource(), cropFilter));
BufferedImage tag = new BufferedImage(width, height,
BufferedImage.TYPE_INT_RGB);
Graphics2D g = (Graphics2D) tag.getGraphics();
g.setRenderingHint(RenderingHints.KEY_INTERPOLATION,
RenderingHints.VALUE_INTERPOLATION_BILINEAR);
g.drawImage(img, 0, 0, null);
g.dispose();
ImageIO.write(tag, "jpg", new File(imageFullPath));

问题就出在RenderingHints.KEY_INTERPOLATION上面,貌似这个是不带alpha通道的处理,改成BufferedImage.TYPE_INT_ARGB_PRE后恢复正常。BufferedImage中的各个值的含义如下(copy自别人博客):

BufferedImage.TYPE_INT_RGB:8 位 RGB 颜色分量,不带alpha通道。
BufferedImage.TYPE_INT_ARGB:8 位 RGBA 颜色分量,带alpha通道。
BufferedImage.TYPE_INT_ARGB_PRE:8 位 RGBA 颜色分量,已预乘以 alpha。
BufferedImage.TYPE_INT_BGR:8 位 RGB 颜色分量Windows 或 Solaris 风格的图像,不带alpha通道。
BufferedImage.TYPE_3BYTE_BGR:8位GBA颜色分量,用3字节存储Blue、Green和Red三种颜色,不存在alpha。
BufferedImage.TYPE_4BYTE_ABGR:8位RGBA颜色分量,用3字节存储Blue、Green和Red三种颜色以及1字节alpha。
BufferedImage.TYPE_4BYTE_ABGR_PRE:具有用3字节存储的Blue、Green和Red三种颜色以及1字节alpha。
BufferedImage.TYPE_USHORT_565_RGB:具有5-6-5RGB颜色分量(5位Red、6位Green、5位Blue)的图像,不带alpha。
BufferedImage.TYPE_USHORT_555_RGB:具有5-5-5RGB颜色分量(5位Red、5位Green、5位Blue)的图像,不带alpha。
BufferedImage.TYPE_BYTE_GRAY:表示无符号byte灰度级图像(无索引)。
BufferedImage.TYPE_USHORT_GRAY:表示一个无符号short 灰度级图像(无索引)。
BufferedImage.TYPE_BYTE_BINARY:表示一个不透明的以字节打包的 1、2 或 4 位图像。
BufferedImage.TYPE_BYTE_INDEXED:表示带索引的字节图像。
原文地址:https://www.cnblogs.com/ggzwtj/p/2377801.html