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 图片 ...
随机推荐
- Python开发者年度调研,结果出乎意料!
来源商业新知网,原标题:Python开发者年度调研:一半Python用户也用JS,2/3选择Linux系统 作为高级编程语言,Python的受欢迎程度近几年一直在往 上涨.每年,Python官方都会针 ...
- KCF:High-Speed Tracking with Kernelized Correlation Filters 的翻译与分析(一)。分享与转发请注明出处-作者:行于此路
High-Speed Tracking with Kernelized Correlation Filters 的翻译与分析 基于核相关滤波器的高速目标跟踪方法,简称KCF 写在前面,之所以对这篇文章 ...
- Tomcat配置https协议访问
Tomcat9配置https协议访问: https://blog.csdn.net/weixin_42273374/article/details/81010203 配置Tomcat使用https协议 ...
- kdtree HDU5992
STL里面的nth_element()函数 用法:nth_element(first,nth,last) int a[maxn]; nth_element(a,a+k,a+f); 作用:在a到a+f区 ...
- Django 缓存
官方文档 缓存的出现就是为了减轻对数据库的压力和加快内存访问的速度.我们的访问请求最终都是返回一个大的字符串,缓存就是将这段字符串直接存储起来,下次你来了,不用经过view去数据库或者内存拿到数据再渲 ...
- UGUI脚本添加Btn回调的方法
using System.Collections; using System.Collections.Generic; using UnityEngine; using UnityEngine.UI; ...
- tcp,Socket,三次握手和四次挥手的图示
tcp的图示: Socket的图示: Socket原理图示: “三次握手”图示介绍: 客户端向服务器发送一个SYN J 服务器向客户端响应一个SYN K,并对SYN J进行确认ACK J+1 客户端再 ...
- 链接错误:multiple definition of 'xxx' 问题解决及其原理
内容借鉴 于CSDN炸鸡叔 错因 截图: “multiple definition of 'head' ” “multiple definition of 'tail' ” 解决过程: 1.首先要 ...
- 实际项目中如何使用git命令
使用工具:Git Bash 工作空间项目存放路径C:/用户/git/demoProject 操作步骤: 1.切换到git项目路径 cd git/demoProject 2.git status ...
- [程序员代码面试指南]数组和矩阵问题-找到无序数组中最小的k个数(堆排序)
题目链接 https://www.nowcoder.com/practice/6a296eb82cf844ca8539b57c23e6e9bf?tpId=13&tqId=11182&t ...