ホームページ  >  記事  >  バックエンド開発  >  Java と PHP を使用してサムネイルを生成したり、サイズを圧縮したりする方法

Java と PHP を使用してサムネイルを生成したり、サイズを圧縮したりする方法

WBOY
WBOYオリジナル
2016-06-20 12:40:291282ブラウズ

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

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
前の記事:属性()エラー次の記事:属性()エラー