开发者社区> 问答> 正文

java读取图片 压缩处理泛红:报错

有一个图片在压缩之后会泛红,其他图片都正常,代码是一样的。
在网上找了很多例子,但处理这张图片还是会泛红。
通过代码调试发现:
只要用 BufferedImage srcImg = ImageIO.read(srcFile);  
图片无论是否压缩,都已经泛红了。
求指导:  qq  673752314
由于图片在200K以上,这里上传不上来,放到云盘上了,请大家帮忙看下
http://pan.baidu.com/s/1pJEBfp5

展开
收起
kun坤 2020-06-08 19:22:14 808 0
1 条回答
写回答
取消 提交回答
  • 这个问题我解决了(借鉴CKFinder源码),虽然不知道什么原因,但是和大家分享下

    package com.wyy.util;
    
    import java.awt.Graphics;
    import java.awt.GraphicsConfiguration;
    import java.awt.GraphicsDevice;
    import java.awt.GraphicsEnvironment;
    import java.awt.HeadlessException;
    import java.awt.Image;
    import java.awt.Toolkit;
    import java.awt.Transparency;
    import java.awt.image.BufferedImage;
    import java.io.ByteArrayOutputStream;
    import java.io.File;
    import java.io.FileInputStream;
    import java.io.IOException;
    import java.io.InputStream;
    
    import javax.swing.ImageIcon;
    
    public class ImageUtil {
    	
    	/**
    	 * @param srcFile  原图路径
    	 * @param desFile  压缩图片保存路径
    	 * @return
    	 */
    	public static void compress(String srcFile, String desFile, int outputWidth, int outputHeight){
    		try{
    			byte[] imageData = toByteArray(new FileInputStream(srcFile));
    			BufferedImage image = toBufferedImage(imageData);
    			//输入图片
    			File outFile = new File(desFile);
    			createPath(outFile, true);
    			resizeImage(image, outputWidth, outputHeight, 0.9f, outFile);
    		}catch(Exception e){
    			e.printStackTrace();
    		}
    	}
    	
    	//把原图转换成二进制
    	private static byte[] toByteArray(InputStream input) {
     		if (input == null) {
     			return null;
     		}
     		ByteArrayOutputStream output = null;
     		byte[] result = null;
     		try {
     			output = new ByteArrayOutputStream();
     			byte[] buffer = new byte[1024 * 100];
     			int n = 0;
     			while (-1 != (n = input.read(buffer))) {
     				output.write(buffer, 0, n);
     			}
     			result = output.toByteArray();
     			if (output != null) {
    				output.close();
    			}
     		} catch (Exception e) {}
     		return result;
     	}
    	//把二进制转换成图片
    	private static BufferedImage toBufferedImage(byte[] imagedata) {
     		Image image = Toolkit.getDefaultToolkit().createImage(imagedata);
     		if (image instanceof BufferedImage) {
     			return (BufferedImage) image;
     		}
     		image = new ImageIcon(image).getImage();
     		BufferedImage bimage = null;
     		GraphicsEnvironment ge = GraphicsEnvironment.getLocalGraphicsEnvironment();
     		try {
     			int transparency = Transparency.OPAQUE;
     			GraphicsDevice gs = ge.getDefaultScreenDevice();
     			GraphicsConfiguration gc = gs.getDefaultConfiguration();
     			bimage = gc.createCompatibleImage(image.getWidth(null), image.getHeight(null), transparency);
     		} catch (HeadlessException e) {
     		}
     		if (bimage == null) {
     			int type = BufferedImage.TYPE_INT_RGB;
     			bimage = new BufferedImage(image.getWidth(null), image.getHeight(null), type);
     		}
     		Graphics g = bimage.createGraphics();
     		g.drawImage(image, 0, 0, null);
     		g.dispose();
     		return bimage;
     	}
    	/**
    	 * 创建输出目录
    	 * @param file
    	 * @param asFile
    	 * @throws IOException
    	 */
    	private static void createPath(File file, boolean asFile) throws IOException {
    		String path = file.getAbsolutePath();
    		String dirPath;
    		if (asFile)
    			dirPath = path.substring(0, path.lastIndexOf(File.separator));
    		else {
    			dirPath = path;
    		}
    		File dir = new File(dirPath);
    		if (!dir.exists()) {
    			dir.mkdirs();
    		}
    		if (asFile)
    			file.createNewFile();
    	}
    	
    	/**
    	 * 借助第三方工具输出图片
    	 * @param sourceImage
    	 * @param width
    	 * @param height
    	 * @param quality
    	 * @param destFile
    	 * @throws IOException
    	 */
    	private static void resizeImage(final BufferedImage sourceImage, final int width, final int height, final float quality, final File destFile) throws IOException {
    // 		try {
    // 			Thumbnails.of(sourceImage).size(width, height).keepAspectRatio(false).outputQuality(quality).toFile(destFile);
    // 		} catch (IllegalStateException e) {
    // 			Thumbnails.of(sourceImage).size(width, height).keepAspectRatio(false).toFile(destFile);
    // 		}
     	}
    }

    ######大佬你的demo运行不了呀###### 转换代码存在bug呗
    换个稳健点的 ######遇到过,没解决,mark######谢谢,解决了我的问题。不过gif格式就不适用,出来都是黑色的######谢谢啦,解决我今天遇到的问题######大佬,你是怎么解决的

    2020-06-08 19:22:19
    赞同 展开评论 打赏
问答分类:
问答地址:
问答排行榜
最热
最新

相关电子书

更多
Spring Cloud Alibaba - 重新定义 Java Cloud-Native 立即下载
The Reactive Cloud Native Arch 立即下载
JAVA开发手册1.5.0 立即下载