您的位置:首页 > 编程语言 > Java开发

Google提供的Thumbnails对图片的各种操作(缩放、加水印、翻转、转换图片格式)性能比jdk提供的好N倍,压缩出来的图片更清晰

2015-03-05 19:53 561 查看
<span style="font-family: Arial, Helvetica, sans-serif; background-color: rgb(255, 255, 255);">jar下载:</span><span style="font-family: Arial, Helvetica, sans-serif; background-color: rgb(255, 255, 255);">http://code.google.com/p/thumbnailator/</span>
<span style="font-family: Arial, Helvetica, sans-serif; background-color: rgb(255, 255, 255);">版本:thumbnailator-0.4.8.jar</span>



package com.lvmama.comm.utils.pic;
import java.awt.Image;
import java.io.File;
import java.io.IOException;

import javax.imageio.ImageIO;

import net.coobird.thumbnailator.Thumbnails;
import net.coobird.thumbnailator.geometry.Positions;

@SuppressWarnings("restriction")
public class ImageUtil2 {

/**
* 缩放图像(按高度和宽度缩放)
* @param srcImageFile 源图像文件地址
* @param result 缩放后的图像地址
* @param height 缩放后的高度
* @param width 缩放后的宽度
* @throws IOException
* @isPHP_PC php的pc端调用
* @isPHP_MOBILE php的移动无线端调用
*/
public final static void scale(String srcImageFile, String newImageFile, int width,int height, boolean isPHP_PC,boolean isPHP_MOBILE) throws IOException {
Image img = ImageIO.read(new File(srcImageFile));
int newWidth = img.getWidth(null),newHeight = img.getHeight(null);

// 计算比例
if(isPHP_MOBILE && !isPHP_PC && img.getWidth(null) <= width){
//无线调用时,宽度没有压缩宽大,则返回原图
}else if ((img.getHeight(null) > height) || (img.getWidth(null) > width)) {

if(isPHP_PC && !isPHP_MOBILE){//PHP的微游记PC端缩略图以定宽或定高(以较长的一边)为基准
if(img.getWidth(null) > img.getHeight(null)){
newWidth = width;
newHeight = (int)(new Integer(width).doubleValue()/img.getWidth(null)*img.getHeight(null));
}else{
newHeight = height;
newWidth = (int)(new Integer(height).doubleValue()/img.getHeight(null)*img.getWidth(null));
}

}else if(isPHP_MOBILE && !isPHP_PC){//PHP的微游记(移动)端缩略图以定宽为基准
newWidth = width;
newHeight = (int)(new Integer(width).doubleValue()/img.getWidth(null)*img.getHeight(null));

}else {//vst端:原图长/压缩长 > 原图宽/压缩图宽   ? 原图长/压缩长:原图宽/压缩图宽,以比例较大的为基准压缩
// 压缩比判断方法二
double ratio_height = (new Integer(height)).doubleValue()/ img.getHeight(null);
double ratio_width = (new Integer(width)).doubleValue() / img.getWidth(null);

if(ratio_height>ratio_width){
newHeight = height;
newWidth = (int)((new Integer(height)).doubleValue()/ img.getHeight(null) * img.getWidth(null));
}else{
newWidth = width;
newHeight = (int)((new Integer(width)).doubleValue() / img.getWidth(null) * img.getHeight(null));
}
}
}

Thumbnails.of(srcImageFile)
.size(newWidth, newHeight)
.toFile(newImageFile);

}

/**
* 添加图片水印
*
* @param targetImg
*            目标图片路径,如:C:\\myPictrue\\1.jpg
* @param waterImg
*            水印图片路径,如:C:\\myPictrue\\logo.png
* @param positions 水印图片所在位置
*
* @param alpha
*            透明度(0.0 -- 1.0, 0.0为完全透明,1.0为完全不透明) * @param quality 压缩清晰度
*            <b>建议为1.0</b>
* @throws IOException
*/
public final static void pressImage(String targetImg, File waterImg, Positions positions, float alpha) throws IOException {
Thumbnails.of(targetImg)
.watermark(positions, ImageIO.read(waterImg), alpha)
.scale(1)//缩放比例
.toFile(targetImg);
}

/**
* 把图片印刷到图片上
*
* @param pressImg
*            -- 水印文件
* @param targetImg
*            -- 目标文件
* @param alpha
*            透明度(0.0 -- 1.0, 0.0为完全透明,1.0为完全不透明) * @param quality 压缩清晰度
*            <b>建议为1.0</b>
*
* @throws IOException
*/
public final static void pressImage(String targetImg, String pressImg,float alpha) throws IOException {
Thumbnails.of(targetImg)
.watermark(Positions.TOP_LEFT, ImageIO.read(new File(pressImg)), alpha)
.outputQuality(1)//生成质量100%
.scale(1)//缩放比例
.toFile(targetImg);
}

/**
* 把图片印刷到图片上
*
* @param pressImg
*            -- 水印文件
* @param targetImg
*            -- 目标文件
* @param position
*
@param alpha
*            透明度(0.0 -- 1.0, 0.0为完全透明,1.0为完全不透明) * @param quality 压缩清晰度
*            <b>建议为1.0</b>
*
* @throws IOException
*/
public final static void pressImage(String targetImg, String pressImg, Positions position,float alpha) throws IOException {
Thumbnails.of(targetImg)
.watermark(position, ImageIO.read(new File(pressImg)), alpha)
.outputQuality(1)//生成质量100%
.scale(1)//缩放比例
.toFile(targetImg);
}

/**
* 裁剪图片
* @throws IOException
*/
public static void region(String sourceImg,String newImgPath,int x,int y,int width,int height) throws IOException{
//指定坐标
Thumbnails.of(sourceImg)
.sourceRegion(x, y, width, height)//x轴、y轴,裁剪宽、裁剪高
.size(width, height)//裁剪后的图片生成的尺寸
//设置是否按比例  false,图片可能会走形 默认true,必须在设置尺寸后设置
.keepAspectRatio(false)
.toFile(newImgPath);
}

/**
* 旋转图片
* @param sourceImage 原图片
* @param newImage 生成的新图片
* @param degrees 旋转度数
* @throws IOException
*/
public static void rorate(String sourceImage,String newImage,double degrees) throws IOException{
Thumbnails.of(sourceImage)
.rotate(degrees)//旋转度数
.scale(1)//缩放比例
.toFile(newImage);
}

/**
* 转换图片格式
* @param sourceImg 原图
* @param newImg    转换后的新图
* @param format	格式
* @throws IOException
*/
public static void transferImageFormat(String sourceImg,String newImg,String format) throws IOException{
Thumbnails.of(sourceImg)
.outputFormat(format)
.scale(1)
.toFile(newImg);
}

public static void main(String[] args) {
try {
//ImageUtil2.scale("C:\\Users\\chengjiangbo\\Desktop\\images\\c743d228-3ecf-4711-9187-725f252d14b1.jpg", "C:\\Users\\chengjiangbo\\Desktop\\images\\480_300.jpg", 480, 300, true, false);
//ImageUtil2.pressImage("C:\\Users\\chengjiangbo\\Desktop\\images\\IMG_waterImage.jpg", "C:\\Users\\chengjiangbo\\Desktop\\images\\QRCode.png",Positions.BOTTOM_CENTER, 1);
//ImageUtil2.region("C:\\Users\\chengjiangbo\\Desktop\\images\\IMG_waterImage.jpg", "C:\\Users\\chengjiangbo\\Desktop\\images\\IMG_waterImage123.jpg",0,0,100,100);
//ImageUtil2.rorate("C:\\Users\\chengjiangbo\\Desktop\\images\\IMG_waterImage.jpg", "C:\\Users\\chengjiangbo\\Desktop\\images\\IMG_waterImage111.jpg", 90);
ImageUtil2.transferImageFormat("C:\\Users\\chengjiangbo\\Desktop\\images\\QRCode.png", "C:\\Users\\chengjiangbo\\Desktop\\images\\QRCode.jpg", "JPEG");
} catch (IOException e) {
e.printStackTrace();
}
}
}


内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐