标签:java 图片裁剪上传变红等失真现象、cmyk颜色模式图片裁剪异常现象处理
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; }
本文出自 “艺晨光的博客” 博客,请务必保留此出处http://ycgit.blog.51cto.com/8590215/1735974
java 图片裁剪上传变红等失真现象、cmyk颜色模式图片裁剪异常现象处理
标签:java 图片裁剪上传变红等失真现象、cmyk颜色模式图片裁剪异常现象处理
原文地址:http://ycgit.blog.51cto.com/8590215/1735974