java 图片缩放,区域裁剪,水印,旋转,保持比例等处理

java 图片缩放,区域裁剪,水印,旋转,保持比例等处理

maven 引入jar包

<!-- https://mvnrepository.com/artifact/net.coobird/thumbnailator -->
<dependency>
	<groupId>net.coobird</groupId>
	<artifactId>thumbnailator</artifactId>
	<version>0.4.12</version>
</dependency>

图片处理工具类

package com.???.utils;

import java.awt.image.BufferedImage;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;

import javax.imageio.ImageIO;

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

public class ImageCompressionUtil {
	final static String IMG_PATH = "D:/ThumbnailsTest/";
	final static String IMG_NAME_JPG = "原图片.jpg";
	final static String IMG_NAME_PMG = "PNG原图片.png";
	final static String IMG_NAME_WATERMARK = "水印.jpg";

	private static void imageCompression(String type) throws IOException{
		// TODO Auto-generated method stub
		switch(type){
			case "指定大小进行缩放1":
				/* 
				 * size(宽度, 高度)  
				 * 若图片横比200小,高比300小,不变 
				 * 若图片横比200小,高比300大,高缩小到300,图片比例不变 
				 * 若图片横比200大,高比300小,横缩小到200,图片比例不变 
				 * 若图片横比200大,高比300大,图片按比例缩小,横为200或高为300 
				 */  
				Thumbnails.of(IMG_PATH+IMG_NAME_JPG).size(200, 300).toFile(IMG_PATH+"指定大小进行缩放1(200x300).jpg");  
			    break;
			case "指定大小进行缩放2":
				/*
				 * keepAspectRatio(false):按照比例缩放的  
				 * keepAspectRatio(true):按照大小缩放的
				 * 默认:true
				 */
				Thumbnails.of(IMG_PATH+IMG_NAME_JPG).size(200, 300).keepAspectRatio(true).toFile(IMG_PATH+"指定大小进行缩放2(200x300).jpg");
			    break;
			case "按照比例进行缩放25%":
				/**
				 * scale(比例)  
				 */
				Thumbnails.of(IMG_PATH+IMG_NAME_JPG).scale(0.25f).toFile(IMG_PATH+"按照比例进行缩放25%.jpg");
			    break;
			case "按照比例进行缩放100%":
				/**
				 * scale(比例)  
				 */
				Thumbnails.of(IMG_PATH+IMG_NAME_JPG).scale(1.0f).toFile(IMG_PATH+"按照比例进行缩放100%.jpg");
			    break;
			case "按照比例进行缩放125%":
				/**
				 * scale(比例)  
				 */
				Thumbnails.of(IMG_PATH+IMG_NAME_JPG).scale(1.25f).toFile(IMG_PATH+"按照比例进行缩放125%.jpg");
			    break;
			case "顺时针旋转90度":
				/**
				 * rotate(角度),正数:顺时针	负数:逆时针 
				 */
				Thumbnails.of(IMG_PATH+IMG_NAME_JPG).size(1280,1024).rotate(90).toFile(IMG_PATH+"顺时针旋转90度.jpg");
			    break;
			case "逆时针旋转90度":
				/**
				 * rotate(角度),正数:顺时针	负数:逆时针
				 */
				Thumbnails.of(IMG_PATH+IMG_NAME_JPG).size(1280,1024).rotate(-90).toFile(IMG_PATH+"逆时针旋转90度.jpg");
			    break;
			case "图片水印-右下角":
				/**
				 * watermark(位置,水印图,透明度)
				 * outputQuality:输出的图片质量,范围:0.0~1.0,1为最高质量。
				 */
				Thumbnails.of(IMG_PATH+IMG_NAME_JPG)  
			    .size(1280,1024)  
			    .watermark(Positions.BOTTOM_RIGHT,ImageIO.read(new File(IMG_PATH+IMG_NAME_WATERMARK)),0.5f)  
			    .outputQuality(0.8f)  
			    .toFile(IMG_PATH+"图片水印-右下角.jpg");
			    break;
			case "图片水印-中间":
				/**
				 * watermark(位置,水印图,透明度)
				 * outputQuality:输出的图片质量,范围:0.0~1.0,1为最高质量。
				 */
				Thumbnails.of(IMG_PATH+IMG_NAME_JPG)  
			    .size(1280,1024)  
			    .watermark(Positions.CENTER,ImageIO.read(new File(IMG_PATH+IMG_NAME_WATERMARK)),0.5f)  
			    .outputQuality(0.8f)  
			    .toFile(IMG_PATH+"图片水印-中间.jpg");
			    break;
			case "裁剪-中心":
				/**
				 * 图片中心400*400的区域  
				 */
				Thumbnails.of(IMG_PATH+IMG_NAME_JPG)  
			    .sourceRegion(Positions.CENTER,400,400)  
			    .size(200,200)  
			    .keepAspectRatio(false)  
			    .toFile(IMG_PATH+"裁剪-中心400x400的区域.jpg");
			    break;
			case "裁剪-右下":
				/**
				 * 图片右下400*400的区域
				 */
				Thumbnails.of(IMG_PATH+IMG_NAME_JPG)   
			    .sourceRegion(Positions.BOTTOM_RIGHT,400,400)  
			    .size(200,200)  
			    .keepAspectRatio(false)  
			    .toFile(IMG_PATH+"裁剪-右下400x400的区域.jpg");
			    break;
			case "裁剪-指定坐标":
				/**
				 * 指定坐标  
				 */
				Thumbnails.of(IMG_PATH+IMG_NAME_JPG)   
			    .sourceRegion(600,500,400,400)  
			    .size(200,200)  
			    .keepAspectRatio(false)  
			    .toFile(IMG_PATH+"裁剪-指定坐标区域.jpg");
			    break;
			case "转化图像格式jpg-png":
				/**
				 * outputFormat(图像格式)  
				 */
				Thumbnails.of(IMG_PATH+IMG_NAME_JPG).size(1280,1024).outputFormat("png").toFile(IMG_PATH+"转化图像格式jpg-png.png");
			    break;
			case "转化图像格式jpg-gif":
				/**
				 * outputFormat(图像格式)
				 */
				Thumbnails.of(IMG_PATH+IMG_NAME_JPG).size(1280,1024).outputFormat("gif").toFile(IMG_PATH+"转化图像格式jpg-gif.gif");
			    break;
			case "转化图像格式png-jpg":
				/**
				 * outputFormat(图像格式)
				 */
				Thumbnails.of(IMG_PATH+IMG_NAME_PMG).size(1280,1024).outputFormat("jpg").toFile(IMG_PATH+"转化图像格式png-jpg.jpg");
			    break;
			case "输出到OutputStream":
				/**
				 * toOutputStream(流对象)
				 */
				OutputStream os = new FileOutputStream(IMG_PATH+"输出到OutputStream.jpg");  
				Thumbnails.of(IMG_PATH+IMG_NAME_JPG).size(1280,1024).toOutputStream(os);  
			    break;
			case "输出到BufferedImage":
				/**
				 * asBufferedImage()返回BufferedImage
				 */
				BufferedImage thumbnail=Thumbnails.of(IMG_PATH+IMG_NAME_JPG).size(1280,1024).asBufferedImage();  
				ImageIO.write(thumbnail,"jpg",new File(IMG_PATH+"输出到BufferedImage.jpg"));  
			    break;
			case "场景一-图片尺寸不变,修改图片文件类型":
				/**
				 * outputFormat:输出的图片格式。注意使用该方法后toFile()方法不要再含有文件类型的后缀了,否则会生成 XXX.png.png 的图片。
				 */
				Thumbnails.of(IMG_PATH+IMG_NAME_JPG).scale(1f).outputFormat("png").toFile(IMG_PATH+"场景一-图片尺寸不变,修改图片文件类型");   
			    break;
			case "场景二-图片尺寸不变,压缩图片文件大小":
				/**
				 * outputQuality:输出的图片质量,范围:0.0~1.0,1为最高质量。
				 * 注意使用该方法时输出的图片格式必须为jpg(即outputFormat("jpg")。其他格式我没试过,感兴趣的自己可以试试)。
				 * 否则若是输出png格式图片,则该方法作用无效【这其实应该算是bug】。
				 */
				Thumbnails.of(IMG_PATH+IMG_NAME_JPG).scale(1f).outputQuality(0.25f).outputFormat("jpg").toFile(IMG_PATH+"场景二-图片尺寸不变,压缩图片文件大小");   
			    break;
			case "场景三-压缩至指定图片尺寸,不保持图片比例":
				/**
				 * 例如:横400高300
				 */
				Thumbnails.of(IMG_PATH+IMG_NAME_JPG).forceSize(400, 300).toFile(IMG_PATH+"场景三-压缩至指定图片尺寸,不保持图片比例.jpg");   
			    break;
			case "场景四-压缩至指定图片尺寸,保持图片不变形,多余部分裁剪掉":
				/**
				 * 例如:横400高300
				 */
				String imagePath = IMG_PATH+IMG_NAME_JPG;  
				BufferedImage image = ImageIO.read(new File(imagePath));  
				Builder<BufferedImage> builder = null;  
				  
				int imageWidth = image.getWidth();  
				int imageHeitht = image.getHeight();  
				if ((float)300 / 400 != (float)imageWidth / imageHeitht) {  
				    if (imageWidth > imageHeitht) {  
				        image = Thumbnails.of(imagePath).height(300).asBufferedImage();  
				    } else {  
				        image = Thumbnails.of(imagePath).width(400).asBufferedImage();  
				    }  
				    builder = Thumbnails.of(image).sourceRegion(Positions.CENTER, 400, 300).size(400, 300);  
				} else {  
				    builder = Thumbnails.of(image).size(400, 300);  
				}  
				builder.outputFormat("jpg").toFile(IMG_PATH+"场景四-压缩至指定图片尺寸,保持图片不变形,多余部分裁剪掉");   
			    break;
			default:
	            break;
		}
		
	}
	
	public static void main(String[] args) throws IOException {
		imageCompression("指定大小进行缩放1");
		imageCompression("指定大小进行缩放2");
		imageCompression("按照比例进行缩放25%");
		imageCompression("按照比例进行缩放100%");
		imageCompression("按照比例进行缩放125%");
		imageCompression("顺时针旋转90度");
		imageCompression("逆时针旋转90度");
		imageCompression("图片水印-右下角");
		imageCompression("图片水印-中间");
		imageCompression("裁剪-中心");
		imageCompression("裁剪-右下");
		imageCompression("裁剪-指定坐标");
		imageCompression("转化图像格式jpg-png");
		imageCompression("转化图像格式jpg-gif");
		imageCompression("转化图像格式png-jpg");
		imageCompression("输出到OutputStream");
		imageCompression("输出到BufferedImage");
		imageCompression("场景一-图片尺寸不变,修改图片文件类型");
		imageCompression("场景二-图片尺寸不变,压缩图片文件大小");
		imageCompression("场景三-压缩至指定图片尺寸,不保持图片比例");
		imageCompression("场景四-压缩至指定图片尺寸,保持图片不变形,多余部分裁剪掉");
	}


}

效果
图片压缩效果杠杠的,原图片20M,压缩25%后才248KB
在这里插入图片描述
原图片(20M)
在这里插入图片描述
按照比例进行缩放25%后(248KB)
在这里插入图片描述
压缩功能很强大,不仔细看你能看出差别吗?

代码例子下载链接: https://download.csdn.net/download/qweasdzxc01233210/12760170

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
可以使用Java提供的图像处理库,比如Java Advanced Imaging (JAI)或者Java ImageIO来编辑图片内容。以下是一个使用Java ImageIO库进行图片编辑的示例代码,包括裁剪旋转缩放、添加文字和添加水印: ```java import java.awt.Color; import java.awt.Font; import java.awt.Graphics2D; import java.awt.RenderingHints; import java.awt.geom.AffineTransform; import java.awt.image.BufferedImage; import java.io.File; import javax.imageio.ImageIO; public class ImageEditor { public static void main(String[] args) throws Exception { // 读取原始图片 BufferedImage originalImage = ImageIO.read(new File("original.jpg")); // 裁剪图片 int x = 100; int y = 100; int width = 300; int height = 200; BufferedImage croppedImage = originalImage.getSubimage(x, y, width, height); // 旋转图片 double angle = Math.toRadians(45); AffineTransform transform = new AffineTransform(); transform.rotate(angle, originalImage.getWidth()/2, originalImage.getHeight()/2); BufferedImage rotatedImage = new BufferedImage(originalImage.getWidth(), originalImage.getHeight(), BufferedImage.TYPE_INT_RGB); Graphics2D g = rotatedImage.createGraphics(); g.setTransform(transform); g.drawImage(originalImage, 0, 0, null); // 缩放图片 double scale = 0.5; int newWidth = (int)(originalImage.getWidth() * scale); int newHeight = (int)(originalImage.getHeight() * scale); BufferedImage scaledImage = new BufferedImage(newWidth, newHeight, BufferedImage.TYPE_INT_RGB); g = scaledImage.createGraphics(); g.setRenderingHint(RenderingHints.KEY_INTERPOLATION, RenderingHints.VALUE_INTERPOLATION_BICUBIC); g.drawImage(originalImage, 0, 0, newWidth, newHeight, null); // 添加文字 g = originalImage.createGraphics(); Font font = new Font("Arial", Font.BOLD, 24); g.setFont(font); g.setColor(Color.RED); g.drawString("Hello World!", 50, 50); // 添加水印 BufferedImage watermarkImage = ImageIO.read(new File("watermark.png")); int watermarkX = originalImage.getWidth() - watermarkImage.getWidth() - 10; int watermarkY = originalImage.getHeight() - watermarkImage.getHeight() - 10; g.drawImage(watermarkImage, watermarkX, watermarkY, null); // 将编辑后的图片保存到文件 ImageIO.write(croppedImage, "jpg", new File("cropped.jpg")); ImageIO.write(rotatedImage, "jpg", new File("rotated.jpg")); ImageIO.write(scaledImage, "jpg", new File("scaled.jpg")); ImageIO.write(originalImage, "jpg", new File("text.jpg")); } } ``` 运行此代码后,将生成几个编辑后的图片文件。您可以根据需要进行修改和扩展,以执行其他图像编辑操作。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值