在縮放和截取圖片的時候會發現在處理有透明效果的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:表示帶索引的字節圖像。