java读取图片 压缩处理泛红

娃娃也郁闷 发布于 2015/06/27 12:19
阅读 2K+
收藏 2

有一个图片在压缩之后会泛红,其他图片都正常,代码是一样的。

在网上找了很多例子,但处理这张图片还是会泛红。

通过代码调试发现:

只要用 BufferedImage srcImg = ImageIO.read(srcFile);  

图片无论是否压缩,都已经泛红了。

求指导:  qq  673752314

由于图片在200K以上,这里上传不上来,放到云盘上了,请大家帮忙看下

http://pan.baidu.com/s/1pJEBfp5

加载中
0
娃娃也郁闷

这个问题我解决了(借鉴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);
// 		}
 	}
}



c式小菜鸟
c式小菜鸟
大佬你的demo运行不了呀
0
梅开源
梅开源

转换代码存在bug呗

换个稳健点的

0
五娃
五娃
遇到过,没解决,mark
0
kuyuyingzi
kuyuyingzi
谢谢,解决了我的问题。不过gif格式就不适用,出来都是黑色的
0
黑帽子
黑帽子

谢谢啦,解决我今天遇到的问题

c式小菜鸟
c式小菜鸟
大佬,你是怎么解决的
返回顶部
顶部