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