Java与PHP生成缩略图或者大小压缩的方式

java

package com.app.image;
import java.io.*;
import java.util.Date;
import java.awt.*;
import java.awt.image.*;
import javax.imageio.ImageIO;
import com.sun.image.codec.jpeg.*;
/**
 * 图片压缩处理
 * @author 崔素强
 */
public class ImageThumbOrCompress {
	private Image img;
	private int width;
	private int height;
	
	public static void main(String[] args) throws Exception {
		System.out.println("开始:" + new Date().toLocaleString());
		ImageThumbOrCompress imgCom = new ImageThumbOrCompress("D:/Droid4x/test.jpg");
		imgCom.resizeFix(400, 400);
		System.out.println("结束:" + new Date().toLocaleString());
	}
	/**
	 * 构造函数
	 */
	public ImageThumbOrCompress(String fileName) throws IOException {
		File file = new File(fileName);// 读入文件
		img = ImageIO.read(file);      // 构造Image对象
		width = img.getWidth(null);    // 得到源图宽
		height = img.getHeight(null);  // 得到源图长
	}
	/**
	 * 按照宽度还是高度进行压缩
	 * @param w int 最大宽度
	 * @param h int 最大高度
	 */
	public void resizeFix(int w, int h) throws IOException {
		if (width / height > w / h) {
			resizeByWidth(w);
		} else {
			resizeByHeight(h);
		}
	}
	/**
	 * 以宽度为基准,等比例放缩图片
	 * @param w int 新宽度
	 */
	public void resizeByWidth(int w) throws IOException {
		int h = (int) (height * w / width);
		resize(w, h);
	}
	/**
	 * 以高度为基准,等比例缩放图片
	 * @param h int 新高度
	 */
	public void resizeByHeight(int h) throws IOException {
		int w = (int) (width * h / height);
		resize(w, h);
	}
	/**
	 * 强制压缩/放大图片到固定的大小
	 * @param w int 新宽度
	 * @param h int 新高度
	 */
	public void resize(int w, int h) throws IOException {
		// SCALE_SMOOTH 的缩略算法 生成缩略图片的平滑度的 优先级比速度高 生成的图片质量比较好 但速度慢
		BufferedImage image = new BufferedImage(w, h,BufferedImage.TYPE_INT_RGB ); 
		
		/*
		image.getGraphics().drawImage(
				img.getScaledInstance(newWidth, newHeight,
						Image.SCALE_SMOOTH), 0, 0, null);
		**/
		image.getGraphics().drawImage(img, 0, 0, w, h, null); // 绘制缩小后的图
		File destFile = new File("D:/Droid4x/test2.jpg");
		FileOutputStream out = new FileOutputStream(destFile); // 输出到文件流
		// 可以正常实现bmp、png、gif转jpg
		JPEGImageEncoder encoder = JPEGCodec.createJPEGEncoder(out);
		encoder.encode(image); // JPEG编码
		out.close();
	}
}

另外,在jdk6以上实现了图片大小不变,质量改变的压缩

package com.app.image;

import java.awt.image.BufferedImage;
import java.awt.image.ColorModel;
import java.io.File;
import java.io.FileOutputStream;

import javax.imageio.IIOImage;
import javax.imageio.ImageIO;
import javax.imageio.ImageWriteParam;
import javax.imageio.ImageWriter;


public class ImageQualityCompress {

	
	public static void main(String[] args)
    {
        if(compressPic("D:/Droid4x/test.jpg", "D:/Droid4x/test3.jpg"))
        {
            System.out.println("压缩成功!"); 
        }
        else
        {
            System.out.println("压缩失败!"); 
        }
    }

    public static boolean compressPic(String srcFilePath, String descFilePath)
    {
        File file = null;
        BufferedImage src = null;
        FileOutputStream out = null;
        ImageWriter imgWrier;
        ImageWriteParam imgWriteParams;

        // 指定写图片的方式为 jpg
        imgWrier = ImageIO.getImageWritersByFormatName("jpg").next();
        imgWriteParams = new javax.imageio.plugins.jpeg.JPEGImageWriteParam(null);
        // 要使用压缩,必须指定压缩方式为MODE_EXPLICIT
        imgWriteParams.setCompressionMode(imgWriteParams.MODE_EXPLICIT);
        // 这里指定压缩的程度,参数qality是取值0~1范围内,
        imgWriteParams.setCompressionQuality(0.1f);
        imgWriteParams.setProgressiveMode(imgWriteParams.MODE_DISABLED);
        
        ColorModel colorModel = ColorModel.getRGBdefault();
        // 指定压缩时使用的色彩模式
        imgWriteParams.setDestinationType(new javax.imageio.ImageTypeSpecifier(colorModel, colorModel
                .createCompatibleSampleModel(16, 16)));

        try
        {
            if(srcFilePath==null || srcFilePath.length()==0)
            {
                return false;
            }
            else
            {
                file = new File(srcFilePath);
                src = ImageIO.read(file);
                out = new FileOutputStream(descFilePath);

                imgWrier.reset();
                // 必须先指定 out值,才能调用write方法, ImageOutputStream可以通过任何 OutputStream构造
                imgWrier.setOutput(ImageIO.createImageOutputStream(out));
                // 调用write方法,就可以向输入流写图片
                imgWrier.write(null, new IIOImage(src, null, null), imgWriteParams);
                out.flush();
                out.close();
            }
        }
        catch(Exception e)
        {
            e.printStackTrace();
            return false;
        }
        return true;
    }
}

php

//by MoreWindows (http://blog.csdn.net/MoreWindows )
class CImage
{
    /**
     * 生成保持原图纵横比的缩略图,支持.png .jpg .gif
     * 缩略图类型统一为.png格式
     * $srcFile     原图像文件名称
     * $toW         缩略图宽
     * $toH         缩略图高
     * $toFile      缩略图文件名称,为空覆盖原图像文件
     * @return bool    
    */
    public static function CreateThumbnail($srcFile, $toW, $toH, $toFile="") 
    {
        if ($toFile == "")
        { 
               $toFile = $srcFile; 
        }
        $info = "";
        //返回含有4个单元的数组,0-宽,1-高,2-图像类型,3-宽高的文本描述。
        //失败返回false并产生警告。
        $data = getimagesize($srcFile, $info);
        if (!$data)
            return false;
        
        //将文件载入到资源变量im中
        switch ($data[2]) //1-GIF,2-JPG,3-PNG
        {
        case 1:
            if(!function_exists("imagecreatefromgif"))
            {
                echo "the GD can't support .gif, please use .jpeg or .png! <a href='javascript:history.back();'>back</a>";
                exit();
            }
            $im = imagecreatefromgif($srcFile);
            break;
            
        case 2:
            if(!function_exists("imagecreatefromjpeg"))
            {
                echo "the GD can't support .jpeg, please use other picture! <a href='javascript:history.back();'>back</a>";
                exit();
            }
            $im = imagecreatefromjpeg($srcFile);
            break;
              
        case 3:
            $im = imagecreatefrompng($srcFile);    
            break;
        }
        
        //计算缩略图的宽高
        $srcW = imagesx($im);
        $srcH = imagesy($im);
        $toWH = $toW / $toH;
        $srcWH = $srcW / $srcH;
        if ($toWH <= $srcWH) 
        {
            $ftoW = $toW;
            $ftoH = (int)($ftoW * ($srcH / $srcW));
        }
        else 
        {
            $ftoH = $toH;
            $ftoW = (int)($ftoH * ($srcW / $srcH));
        }
        
        if (function_exists("imagecreatetruecolor")) 
        {
            $ni = imagecreatetruecolor($ftoW, $ftoH); //新建一个真彩色图像
            if ($ni) 
            {
                //重采样拷贝部分图像并调整大小 可保持较好的清晰度
                imagecopyresampled($ni, $im, 0, 0, 0, 0, $ftoW, $ftoH, $srcW, $srcH);
            } 
            else 
            {
                //拷贝部分图像并调整大小
                $ni = imagecreate($ftoW, $ftoH);
                imagecopyresized($ni, $im, 0, 0, 0, 0, $ftoW, $ftoH, $srcW, $srcH);
            }
        }
        else 
        {
            $ni = imagecreate($ftoW, $ftoH);
            imagecopyresized($ni, $im, 0, 0, 0, 0, $ftoW, $ftoH, $srcW, $srcH);
        }

        //保存到文件 统一为.png格式
        imagepng($ni, $toFile); //以 PNG 格式将图像输出到浏览器或文件
        ImageDestroy($ni);
        ImageDestroy($im);
        return true;
    }
}


你可能感兴趣的:(thumb,java生成缩略图,图片质量压缩,PHP生成缩略图,图片大小压缩)