Java與PHP生成縮略圖或者大小壓縮的方式

jopen 8年前發布 | 16K 次閱讀 圖形/圖像處理

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;
    }
}


來自: http://my.oschina.net/ososchina/blog/482951

 本文由用戶 jopen 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!