`
rekoe.net
  • 浏览: 8078 次
  • 性别: Icon_minigender_1
  • 来自: 北京
文章分类
社区版块
存档分类
最新评论

ImageUtil

阅读更多
import java.awt.AlphaComposite;
import java.awt.Color;
import java.awt.Font;
import java.awt.FontFormatException;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Image;
import java.awt.image.BufferedImage;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;

import javax.imageio.ImageIO;

import com.sun.image.codec.jpeg.JPEGCodec;
import com.sun.image.codec.jpeg.JPEGEncodeParam;
import com.sun.image.codec.jpeg.JPEGImageEncoder;

public class ImageUtil {
	private static String[] imageFormatArray = new String[] { ".jpg",".gif", ".png", ".bmp",".jpeg"};
	public static String createWaterMarkWithImage(String srcImgPath,String outputImage, String waterMarkImgPath,String zone,float transparency,float imageQuality,int watermarkMinWidth, int watermarkMinHeight) throws IOException {
		transparency /= 100;
		imageQuality /= 100;
		String srcType = verifyImageFormat(srcImgPath);
		if (srcType == null||verifyImageFormat(waterMarkImgPath)==null) {
			return "img_notype";
		}
		if((srcType.equals("gif")||srcType.equals("jpg"))&&isCattoon(srcImgPath)){
			return "img_isflash";
		}
		FileInputStream srcFis =new FileInputStream(srcImgPath);
		Image src_image = ImageIO.read(srcFis); 
		srcFis.close();
		int width = src_image.getWidth(null);
		int height = src_image.getHeight(null);
		if(width<watermarkMinWidth||height<watermarkMinHeight){
			return "img_mack_nofinish\t"+width + "\t"+ height;
		}		
		BufferedImage bufferedImage = new BufferedImage(width, height,BufferedImage.TYPE_INT_RGB);
		Graphics graphics=bufferedImage.getGraphics();
		graphics.drawImage(src_image, 0, 0, null);
		src_image.flush();
		src_image=null;
		FileInputStream waterMarkFis =new FileInputStream(waterMarkImgPath);
		Image watermark_image = ImageIO.read(waterMarkFis); 
		waterMarkFis.close();
		int waterMarkImgWidth = watermark_image.getWidth(null);
		int waterMarkImgHeight = watermark_image.getHeight(null);
		if(width<waterMarkImgWidth||height<waterMarkImgHeight){
			return "img_mackimg_less";
		}
		int zoneArray[] = getWriteZoneForImage(zone, width, height, waterMarkImgWidth,waterMarkImgHeight);
		graphics.drawImage(watermark_image, zoneArray[0], zoneArray[1],waterMarkImgWidth, waterMarkImgHeight, null, null);
		graphics.dispose();
		watermark_image.flush();
		watermark_image=null;
		try {
			FileOutputStream out = new FileOutputStream(outputImage);
			JPEGImageEncoder encoder = JPEGCodec.createJPEGEncoder(out);
			JPEGEncodeParam param = encoder.getDefaultJPEGEncodeParam(bufferedImage);
			param.setQuality(imageQuality, true);
			encoder.encode(bufferedImage, param);
			out.close();
			bufferedImage.flush();
			bufferedImage = null;
			param=null;
			encoder=null;
		} catch (Exception e) {
			return e.getMessage();
		}
		return null;
	}
	public static String createWaterMarkWithCharacter(String srcImagePath, String outputImagePath,int watermarkminwidth,
			String watermarktext_text,String watermarktext_fontpath,int watermarktext_size,
			int watermarktext_angleInt,String watermarktext_color,int watermarktext_shadowx,
			int watermarktext_shadowy,String watermarktext_shadowcolor,String watermarktext_translatex,
			String watermarktext_translatey,String watermarktext_skewx,String watermarktext_skewy,
			float imageQuality,String watermarkstatus,float watermarktrans) 
			throws IOException {
		watermarktrans /= 100;
		imageQuality /= 100;
		float watermarktext_angle = (float)watermarktext_angleInt/100;
		String srcType = verifyImageFormat(srcImagePath);
		if (srcType == null) {
			return "img_notype";
		}
		if((srcType.equals("gif")||srcType.equals("jpg"))&&isCattoon(srcImagePath)){
			return "img_isflash";
		}
		FileInputStream srcFis =new FileInputStream(srcImagePath);
		Image src_image = ImageIO.read(srcFis); 
		srcFis.close();
		int width = src_image.getWidth(null);
		int height = src_image.getHeight(null);
		if(width<watermarkminwidth){
			return "img_mack_nofinish\t"+ width + "\t"+ height;
		}
		BufferedImage bimage = new BufferedImage(width, height,BufferedImage.TYPE_INT_RGB);
		Graphics2D graphics2D = bimage.createGraphics();
		graphics2D.drawImage(src_image, 0, 0, null); 
		src_image.flush();
		src_image=null;
		
		Font font=null;
		FileInputStream fis=new FileInputStream(watermarktext_fontpath);
		try {
			font = Font.createFont(Font.TRUETYPE_FONT,fis);
		} catch (FontFormatException e1) {
			return "img_mack_nofont";
		}finally{
			fis.close();
		}
		font = font.deriveFont((float)watermarktext_size);		
		int textWidth = graphics2D.getFontMetrics(font).stringWidth(watermarktext_text);
		int textHeigth = graphics2D.getFontMetrics(font).getHeight();
		int zoneArray[] = getWriteZoneForCharacter(watermarkstatus, width, height, textWidth, textHeigth);
		graphics2D.rotate(watermarktext_angle); 
		graphics2D.setFont(font);
		graphics2D.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_OVER,watermarktrans));
		if(watermarktext_shadowcolor!=null&&!watermarktext_shadowcolor.trim().equals("")){
			try{
				graphics2D.setColor(Color.decode(watermarktext_shadowcolor));
			}catch(NumberFormatException exception){
				return "img_mack_shadow";
			}
			graphics2D.drawString(watermarktext_text, zoneArray[0]+watermarktext_shadowx, zoneArray[1]+watermarktext_shadowy); 
		}
		try{
			graphics2D.setColor(Color.decode(watermarktext_color));
		}catch(NumberFormatException exception){
			return "img_mack_color";
		}
		graphics2D.drawString(watermarktext_text, zoneArray[0], zoneArray[1]);  
		graphics2D.dispose();
		try {
			FileOutputStream out = new FileOutputStream(outputImagePath);
			JPEGImageEncoder encoder = JPEGCodec.createJPEGEncoder(out);
			JPEGEncodeParam param = encoder.getDefaultJPEGEncodeParam(bimage);
			param.setQuality(imageQuality, true);
			encoder.encode(bimage, param);
			bimage.flush();
			out.close();
			graphics2D=null;
			bimage=null;
			param=null;
			encoder=null;			
		} catch (Exception e) {
			return e.getMessage();
		}
		return null;
	}

	private static String verifyImageFormat(String fileName) {
		String result = null;		
		String fileType = fileName.substring(fileName.lastIndexOf(".")).toLowerCase();		
		for (String imageType:imageFormatArray) {
			if (fileType.equals(imageType)) {
				result = fileType.substring(1);
				break;
			}
		}
		return result;
	}	
	private static int[] getWriteZoneForImage(String zone, int width, int height,int waterMarkImgWidth, int waterMarkImgHeight) {
		int distance = 5;
		int[] zoneArray = new int[2];
		if ("1".equals(zone)) {
			zoneArray[0] = distance;
			zoneArray[1] = distance;
		}
		if ("2".equals(zone)) {
			zoneArray[0] = (width - waterMarkImgWidth) / 2;
			zoneArray[1] = distance;
		}
		if ("3".equals(zone)) {
			zoneArray[0] = width - distance - waterMarkImgWidth;
			zoneArray[1] = distance;
		}
		if ("4".equals(zone)) {
			zoneArray[0] = distance;
			zoneArray[1] = (height - waterMarkImgHeight) / 2;
		}
		if ("5".equals(zone)) {
			zoneArray[0] = (width - waterMarkImgWidth) / 2;
			zoneArray[1] = (height - waterMarkImgHeight) / 2;
		}
		if ("6".equals(zone)) {
			zoneArray[0] = width - distance - waterMarkImgWidth;
			zoneArray[1] = (height - waterMarkImgHeight) / 2;
		}
		if ("7".equals(zone)) {
			zoneArray[0] = distance;
			zoneArray[1] = height - distance - waterMarkImgHeight;
		}
		if ("8".equals(zone)) {
			zoneArray[0] = (width - waterMarkImgWidth) / 2;
			zoneArray[1] = height - distance - waterMarkImgHeight;
		}
		if ("9".equals(zone)) {
			zoneArray[0] = width - distance - waterMarkImgWidth;
			zoneArray[1] = height - distance - waterMarkImgHeight;
		}
		if ("isRandom".equals(zone)) {
			zoneArray[0] = (int) ((Math.random() * 1000) + 1)% (width - waterMarkImgWidth);
			zoneArray[1] = (int) ((Math.random() * 1000) + 1)% (height - waterMarkImgHeight);
		}
		return zoneArray;
	}
	private static int[] getWriteZoneForCharacter(String zone, int width, int height,int textWidth, int textHeigth) {
		int distance = 15;
		int[] zoneArray = new int[2];

		if ("1".equals(zone)) {
			zoneArray[0] = distance;
			zoneArray[1] = textHeigth;
		}
		if ("2".equals(zone)) {
			zoneArray[0] = (width - textWidth) / 2;
			zoneArray[1] = textHeigth;
		}
		if ("3".equals(zone)) {
			zoneArray[0] = width  - textWidth- distance;
			zoneArray[1] = textHeigth;
		}
		if ("4".equals(zone)) {
			zoneArray[0] = distance;
			zoneArray[1] = height /2+textHeigth/4;
		}
		if ("5".equals(zone)) {
			zoneArray[0] = (width - textWidth) / 2;
			zoneArray[1] = height /2+textHeigth/4;
		}
		if ("6".equals(zone)) {
			zoneArray[0] = width  - textWidth- distance;
			zoneArray[1] = height /2+textHeigth/4;
		}
		if ("7".equals(zone)) {
			zoneArray[0] = distance;
			zoneArray[1] = height  - distance;
		}
		if ("8".equals(zone)) {
			zoneArray[0] = (width - textWidth) / 2;
			zoneArray[1] = height  - distance;
		}
		if ("9".equals(zone)) {
			zoneArray[0] = width  - textWidth- distance;
			zoneArray[1] = height  - distance;
		}
		if ("isRandom".equals(zone)) {
			zoneArray[0] = (int) ((Math.random() * 1000) + 1)% (width - textWidth);
			zoneArray[1] = (int) ((Math.random() * 1000) + 1)% (height - textHeigth);
		}
		return zoneArray;
	}
	public static String createZoomImage(String sourceFilePath,String targetFileName,int width,int height) throws IOException{
		String fileType = verifyImageFormat(sourceFilePath);
		if(fileType==null){
			return "img_notype";
		}
		if((fileType.equals("gif")||fileType.equals("jpg"))&&isCattoon(sourceFilePath)){
			return "img_isflash";
		}
		FileInputStream fis =new FileInputStream(sourceFilePath);  
		Image src_image = ImageIO.read(fis); 
		fis.close();
		double oldHeight=src_image.getHeight(null);
		double oldWidth=src_image.getWidth(null);
		if (oldHeight > height ||oldWidth > width) {
			double ratio = 0;
			if (oldHeight > oldWidth) {
				ratio = (double)height /oldHeight;
			}
			else{
				ratio =(double)width /oldWidth;
			}
			if(ratio>1){
				ratio=1;
			}
			width=(int)(oldWidth*ratio);
			height=(int)(oldHeight*ratio);
			BufferedImage bufferedImage = new BufferedImage(width,height,BufferedImage.TYPE_INT_RGB);
			Graphics graphics = bufferedImage.createGraphics();
			graphics.drawImage(src_image, 0,0, width,height,null);
			graphics.dispose();			
			FileOutputStream fos = new FileOutputStream(targetFileName);
			JPEGImageEncoder jpg_encoder = JPEGCodec.createJPEGEncoder(fos);
			jpg_encoder.encode(bufferedImage); 
			src_image.flush();
			src_image = null;
			fos.close();
			graphics=null;
			fos=null;
			bufferedImage.flush();
			bufferedImage=null;
			jpg_encoder=null;
			return null;
		}else{
			return "img_thumb_nofinish\t"+ width + "\t"+ height;
		}
	}
	
	private static boolean isCattoon(String srcImgPath) throws IOException{
		FileInputStream srcFis =new FileInputStream(srcImgPath);
		int log = 0;
		int currentByte = 0;
		while((currentByte = srcFis.read())!=-1){
			if(log == 0 && currentByte == 0x21
					||log == 1 && currentByte == 0xff
					||log == 2 && currentByte == 0x0b
					||log == 3 && currentByte == 'N'
					||log == 4 && currentByte == 'E'
					||log == 5 && currentByte == 'T'
					||log == 6 && currentByte == 'S'
					||log == 7 && currentByte == 'C'
					||log == 8 && currentByte == 'A'
					||log == 9 && currentByte == 'P'
					||log == 10 && currentByte == 'E'
					||log == 11 && currentByte == '2'
					||log == 12 && currentByte == '.'
					||log == 13 && currentByte == '0'){
				log++;
				continue;
			}
			if(log==14){
				break;
			}
			log = 0;
		}
		srcFis.close();
		return log == 14;
	}
}


处理图片大小
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics