Java实现图片的裁剪(包括透明背景)
需求:
有一张位置大小的图片,现在需要根据这张原图得到指定尺寸的图片,且得到的图片要符合原先图片的比例,就是在原图的基础上等比例缩放得到图片后,在进行剪裁,这样保证得到的图片是原图的一部分,而不是将原图拉伸或着是压缩到指定的尺寸,这样的图片就会严重的失真,且不协调。
例如:
一张原图为600×400的图片,现在需求如下:
- 一张500×300的图片
- 一张700×400的图片
- 一张400×500的图片
注意:得到的图片不能是原图中的人物、景象有拉伸或压缩的感觉。
思路:
500×300的图片:可以看出宽度和高度都在原图的尺寸之内,但是为了多的得到原图的信息,可先将原图按照一定的比率压缩,压缩的比率min(500/600,300/400),为什么要选择这样的压缩比率呢?因为假如按照宽度比进行压缩,虽然得到的图片的宽度和要求的一致,但是那高度呢?有可能高度压缩之前确实是符合的,也就是大于目标图片的高度,但是枷锁之后,可能出现高度比需求的高度小,导致无法安装、要求截取图片,所以需要比较之后进行压缩,这样不会超出范围。
同理,不管要求的图片大小是否超出原图的大小,或是在原图的大小范围之内,都要先比较,然后再压缩,这样就可以保证得到的图片是放大或缩小到最合适并且包含最多的原图信息,不会变形。
计算压缩比例的核心算法:
- /*
- * 核心算法,计算图片的压缩比
- */
- int w= buffer.getWidth();
- int h=buffer.getHeight();
- double ratiox = 1.0d;
- double ratioy = 1.0d;
- ratiox= w * ratiox / width;
- ratioy= h * ratioy / height;
- if( ratiox >= 1){
- if(ratioy < 1){
- ratiox = height * 1.0 / h;
- }else{
- if(ratiox > ratioy){
- ratiox = height * 1.0 / h;
- }else{
- ratiox = width * 1.0 / w;
- }
- }
- }else{
- if(ratioy < 1){
- if(ratiox > ratioy){
- ratiox = height * 1.0 / h;
- }else{
- ratiox = width * 1.0 / w;
- }
- }else{
- ratiox = width * 1.0 / w;
- }
- }
- /*
- * 对于图片的放大或缩小倍数计算完成,ratiox大于1,则表示放大,否则表示缩小
- */
这样,计算完的ratiox就是要压缩的比率。w、h是原图的width和height,而程序中的width和height是要得到图片的width和height。
在生成图片和其他的地方的程序是参考别人的,具体地址给忘了,再次谢过作者,以下是源代码:
- import java.awt.geom.AffineTransform;
- import java.awt.image.AffineTransformOp;
- import java.awt.image.BufferedImage;
- import java.io.File;
- import javax.imageio.ImageIO;
- public class UploadImg {
- String fromFileStr;
- String saveToFileStr;
- String sysimgfile;
- int width;
- int height;
- String suffix;
- /**
- * @param fromFileStr
- * 原始图片完整路径
- * @param saveToFileStr
- * 缩略图片保存路径
- * @param sysimgfilenNow
- * 处理后的图片文件名前缀
- *
- */
- public UploadImg(String fromFileStr, String saveToFileStr, String sysimgfile,String suffix,int width,int height) {
- this.fromFileStr = fromFileStr;
- this.saveToFileStr = saveToFileStr;
- this.sysimgfile = sysimgfile;
- this.width=width;
- this.height=height;
- this.suffix=suffix;
- }
- public boolean createThumbnail() throws Exception {
- // fileExtNmae是图片的格式 gif JPG 或png
- // String fileExtNmae="";
- File F = new File(fromFileStr);
- if (!F.isFile())
- throw new Exception(F
- + " is not image file error in CreateThumbnail!");
- File ThF = new File(saveToFileStr, sysimgfile +"."+suffix);
- BufferedImage buffer = ImageIO.read(F);
- /*
- * 核心算法,计算图片的压缩比
- */
- int w= buffer.getWidth();
- int h=buffer.getHeight();
- double ratiox = 1.0d;
- double ratioy = 1.0d;
- ratiox= w * ratiox / width;
- ratioy= h * ratioy / height;
- if( ratiox >= 1){
- if(ratioy < 1){
- ratiox = height * 1.0 / h;
- }else{
- if(ratiox > ratioy){
- ratiox = height * 1.0 / h;
- }else{
- ratiox = width * 1.0 / w;
- }
- }
- }else{
- if(ratioy < 1){
- if(ratiox > ratioy){
- ratiox = height * 1.0 / h;
- }else{
- ratiox = width * 1.0 / w;
- }
- }else{
- ratiox = width * 1.0 / w;
- }
- }
- /*
- * 对于图片的放大或缩小倍数计算完成,ratiox大于1,则表示放大,否则表示缩小
- */
- AffineTransformOp op = new AffineTransformOp(AffineTransform
- .getScaleInstance(ratiox, ratiox), null);
- buffer = op.filter(buffer, null);
- //从放大的图像中心截图
- buffer = buffer.getSubimage((buffer.getWidth()-width)/2, (buffer.getHeight() - height) / 2, width, height);
- try {
- ImageIO.write(buffer, suffix, ThF);
- } catch (Exception ex) {
- throw new Exception(" ImageIo.write error in CreatThum.: "
- + ex.getMessage());
- }
- return (true);
- }
- public static void main(String[] args) {
- UploadImg UI;
- boolean ss = false;
- try {
- UI = new UploadImg("C:\\Users\\Administrator\\Pictures\\111.jpg", "C:\\Users\\Administrator\\Pictures\\", "ps_low2","png",280,280);
- ss = UI.createThumbnail();
- if (ss) {
- System.out.println("Success");
- } else {
- System.out.println("Error");
- }
- } catch (Exception e) {
- System.out.print(e.toString());
- }
- }
- }
接下来测试几个例子:
原图1024*520:
要求得到尺寸:1000*500
- UI = new UploadImg("F:\\2.jpg", "F:\\", "ps","jpg",1000,500);
目标尺寸1000*700:
- UI = new UploadImg("F:\\2.jpg", "F:\\", "ps","jpg",1000,700);
目标尺寸:1100*600:
- UI = new UploadImg("F:\\2.jpg", "F:\\", "ps","jpg",1100,600);
目标尺寸600*500:
- UI = new UploadImg("F:\\2.jpg", "F:\\", "ps","jpg",600,500);
Java实现图片的裁剪(包括透明背景)的更多相关文章
- 图像处理-裁剪具有透明背景的png
我遇到了需要裁剪具有透明背景的png的问题,用 https://www.yasuotu.com/editor 这个压缩图网站解决了问题. 这里可以选择裁剪的宽度和高度,记得点击确定按钮. 裁剪完成后, ...
- java对图片的裁剪(包括来自网络的图片)
import java.awt.Rectangle; import java.awt.image.BufferedImage; import java.io.File; import java.io. ...
- Java实现图片的裁剪
需求: 有一张位置大小的图片,现在需要根据这张原图得到指定尺寸的图片,且得到的图片要符合原先图片的比例,就是在原图的基础上等比例缩放得到图片后,在进行剪裁,这样保证得到的图片是原图的一部分,而不是将原 ...
- 前端问题——png图片在IE6下透明失效,解决办法
今天,一位同事问我问题,png 图片在IE6下透明背景失效. 解决办法,在网上查了很多,最后还是采用两种方案来解决这个问题 1.把这个网页的png格式图片变更为gif格式的图片.问题解决 2.就是让这 ...
- Qt 制作透明背景图片与裁剪图片(很实用)
这两天想做一个五子棋游戏,想从零开始自己绘制各种图片素材,将经验心得整理如下. 制作透明背景图片: void MyPainter::DrawKit() { QImage image(30, 30, Q ...
- vc下打印透明背景图片
一.前言 刚接到个任务,要把带有透明背景的章子图片打印出来,开始觉得不是很简单吗,直接用vc自动生成的打印功能不就ok了.不过问题却不是想像的那么简单! 二.窗口中显示透明图片 在窗口中显示图片,可以 ...
- php 处理透明背景的图片时的问题
PHP图象处理之透明背景的gif和png图片的一些问题 1,直接读取有透明背景的PNG格式文件,然后直接输出,背景变成了黑色,gif则没有这种情况. 解决方法:使用 imagesavealpha ...
- java多图片上传--前端实现预览--图片压缩 、图片缩放,区域裁剪,水印,旋转,保持比例。
java多图片上传--前端实现预览 前端代码: https://pan.baidu.com/s/1cqKbmjBSXOhFX4HR1XGkyQ 解压后: java后台: <!--文件上传--&g ...
- 网页中PNG透明背景图片的完美应用
PNG 图片在网站设计中是不可或缺的部分,最大的特点应该在于 PNG 可以无损压缩,而且还可以设置透明,对于增强网站的图片色彩效果有重要的作用. 但为什么 PNG 图片却没有 GIF 和 JPG 图片 ...
随机推荐
- 容器——list(双向链表)
做了一道list可以解决的题,才发现list多么的好 转自https://www.cnblogs.com/BeyondAnyTime/archive/2012/08/10/2631191.html 1 ...
- board_key.h/board_key.c
/******************************************************************************* Filename: board_key ...
- [Docker] 使用 Dockerfile 的多级构建 (multi-stage builds)
Multi-stage build 即在一个 Dockerfile 中使用多个 FROM 指令. 每个 FROM 指令可以使用不同的基础镜像,并且每一个都开启新的构建阶段. 你可以有选择地 ...
- 新年Flag,零基础程序媛编程学习计划(持续更新ing)~~
新的一年立下了转行做程序媛的Flag,我是文科妹子,专业是做市场传销…哦不,是市场营销,算是零基础转行,目标是半年内完成自学进入公司工作,目前打算从事的方向短期目标以入行为主,以前端(可以发挥自身审美 ...
- windows安装composer
Composer 是 PHP 的一个依赖管理工具(不是一个包管理器).它允许你申明项目所依赖的代码库,它会在你的项目中为你安装他们. 在windows下安装的方法 方法一:使用安装程序 这是将 Com ...
- CancellationTokenSource 和 CancellationToken 取消线程
Main 程序[分别调用三个方法] static void Main(string[] args) { using (CancellationTokenSource cts = new Cancell ...
- CentOS7下Mysql 5.6.30安装与配置
环境:centos 7 x64 先下载mysql安装包 打开 http://dev.mysql.com/downloads/mysql/ 选择 linux - Generic 再选择 下载完毕后,得 ...
- 基于bootstrap的datepicker
<script src="<%=path %>/js/bootstrap-datepicker.min.js"/> <script src=" ...
- 开发模型之V模型
1.模型目的: V模型的目的在于改进软件开发的效率和效果. 2.常见理论性描述: V模型从整体上看起来,就是一个V字型的结构,由左右两边组成. 左边的下划线分别代表了需求分析.概要设计.详细设计.编 ...
- MongoDB的Replica Set以及Auth的配置
http://blog.0x01.site/2017/01/13/MongoDB%E7%9A%84Replica-Set%E4%BB%A5%E5%8F%8AAuth%E7%9A%84%E9%85%8D ...