1、本文僅爲了提供圖片上傳過程中,部分java圖片處理代碼。
2、以下代碼可以解決部分圖片上傳裁剪後整體變紅等失真現象。
3、以下代碼支持cmyk顏色模式的圖片上傳裁剪。
/** * 圖片裁剪 * @param srcImageFile 裁剪前圖片地址 * @param dirImageFile 裁剪後圖片地址 * @param x 圖片裁剪屬性 * @param y 圖片裁剪屬性 * @param destWidth 圖片裁剪屬性 * @param destHeight 圖片裁剪屬性 */ public static void abscut(String srcImageFile,String dirImageFile,int x,int y,int destWidth,int destHeight) { BufferedImage bi=null; try { ImageFilter cropFilter; Image img = Toolkit.getDefaultToolkit().getImage(srcImageFile);//可讀取丟失ICC信息的圖片(裁剪後圖片變紅等現象的原因) bi = toBufferedImage(img); int srcWidth = bi.getWidth(); int srcHeight = bi.getHeight(); if (srcWidth >= destWidth && srcHeight >= destHeight) { Image image = bi.getScaledInstance(srcWidth, srcHeight, Image.SCALE_DEFAULT); cropFilter = new CropImageFilter(x, y, destWidth, destHeight); img = Toolkit.getDefaultToolkit().createImage( new FilteredImageSource(image.getSource(), cropFilter)); BufferedImage tag = new BufferedImage(destWidth, destHeight, BufferedImage.TYPE_INT_RGB); Graphics g = tag.getGraphics(); g.drawImage(img, 0, 0, null); g.dispose(); ImageIO.write(tag, "jpg", new File(dirImageFile)); } } catch (Exception e) { System.out.println("ImageUtils圖片裁剪異常:"+e.getLocalizedMessage()); } } /** * Image 轉 BufferedImage * @param image * @return */ public static BufferedImage toBufferedImage(Image image) { if (image instanceof BufferedImage) { return (BufferedImage)image; } // This code ensures that all the pixels in the image are loaded image = new ImageIcon(image).getImage(); // Determine if the image has transparent pixels; for this method's // implementation, see e661 Determining If an Image Has Transparent Pixels //boolean hasAlpha = hasAlpha(image); // Create a buffered image with a format that's compatible with the screen BufferedImage bimage = null; GraphicsEnvironment ge = GraphicsEnvironment.getLocalGraphicsEnvironment(); try { // Determine the type of transparency of the new buffered image int transparency = Transparency.OPAQUE; /* if (hasAlpha) { transparency = Transparency.BITMASK; }*/ // Create the buffered image GraphicsDevice gs = ge.getDefaultScreenDevice(); GraphicsConfiguration gc = gs.getDefaultConfiguration(); bimage = gc.createCompatibleImage( image.getWidth(null), image.getHeight(null), transparency); } catch (HeadlessException e) { // The system does not have a screen } if (bimage == null) { // Create a buffered image using the default color model int type = BufferedImage.TYPE_INT_RGB; //int type = BufferedImage.TYPE_3BYTE_BGR;//by wang /*if (hasAlpha) { type = BufferedImage.TYPE_INT_ARGB; }*/ bimage = new BufferedImage(image.getWidth(null), image.getHeight(null), type); } // Copy image to buffered image Graphics g = bimage.createGraphics(); // Paint the image onto the buffered image g.drawImage(image, 0, 0, null); g.dispose(); return bimage; }