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 图片 ...
随机推荐
- Unable to find a single main class from the following candidates ,显示有两个main class
由于基础框架是用的网上down的源码,我将项目名字改了,估计没有进行maven clean,本地调试的时候没有问题. 当发布时候,执行maven install 一直提示上述错误. 解决办法:1.ma ...
- 3.Telnet探测端口后怎么退出
使用 'Ctrl' + ' ] ' 一起按退出
- 关于js-angularJS的路由传参
使用angular进行网页跳转传参 app.controller('payController', function ($scope, $location, payService) { 注明$loca ...
- js前台计算两个日期的间隔时间
js前台计算两个日期的间隔时间(时间差)原创 2017年08月28日 16:09:43 标签:javascript 1144在后台传来两个时间字段,从中解析出两个字符串类型的日期格式 需要在前台解析出 ...
- python拼接字符串方法汇总
python拼接字符串一般有以下几种方法: 1.直接通过(+)操作符拼接 s = 'Hello'+' '+'World'+'!' print(s) 输出结果:Hello World! 这种方式最常用. ...
- paramiko
http://www.cnblogs.com/wupeiqi/articles/5095821.html
- 编译安装redis4.0
下载redis4.0的安装包:http://download.redis.io/releases/redis-4.0.11.tar.gz 这里用的是已经下载到电脑上,只需上传即可 解压缩 [root@ ...
- ubuntu16中部署web项目到tomcat,xft和securecrt连接到ubuntu16(待续。。。)
xftp xftp中新建连接 ubuntu中安装和启动ssh服务 xftp连接到ubuntu 安装JDK,Tomcat sudo tar -zvxf jdk.tar.gz ...
- 兼容的获取样式的函数getStyle()
想要得到某个元素的某个样式属性,可以用: <div id="div01" style="color:red">123</div> var ...
- windows上不能启动Apache,遇到错误的方法之一
最近在2008服务器上安装apache,出现了No installed ConfigArgs for the service "Apache2.4"这个错误. 启动不了,重装了一样 ...