需求:

有一张位置大小的图片,现在需要根据这张原图得到指定尺寸的图片,且得到的图片要符合原先图片的比例,就是在原图的基础上等比例缩放得到图片后,在进行剪裁,这样保证得到的图片是原图的一部分,而不是将原图拉伸或着是压缩到指定的尺寸,这样的图片就会严重的失真,且不协调。

例如:

一张原图为600×400的图片,现在需求如下:

  1. 一张500×300的图片
  2. 一张700×400的图片
  3. 一张400×500的图片

注意:得到的图片不能是原图中的人物、景象有拉伸或压缩的感觉。

思路:

500×300的图片:可以看出宽度和高度都在原图的尺寸之内,但是为了多的得到原图的信息,可先将原图按照一定的比率压缩,压缩的比率min(500/600,300/400),为什么要选择这样的压缩比率呢?因为假如按照宽度比进行压缩,虽然得到的图片的宽度和要求的一致,但是那高度呢?有可能高度压缩之前确实是符合的,也就是大于目标图片的高度,但是枷锁之后,可能出现高度比需求的高度小,导致无法安装、要求截取图片,所以需要比较之后进行压缩,这样不会超出范围。

同理,不管要求的图片大小是否超出原图的大小,或是在原图的大小范围之内,都要先比较,然后再压缩,这样就可以保证得到的图片是放大或缩小到最合适并且包含最多的原图信息,不会变形。

计算压缩比例的核心算法

  1. /*
  2. * 核心算法,计算图片的压缩比
  3. */
  4. int w= buffer.getWidth();
  5. int h=buffer.getHeight();
  6. double ratiox = 1.0d;
  7. double ratioy = 1.0d;
  8. ratiox= w * ratiox / width;
  9. ratioy= h * ratioy / height;
  10. if( ratiox >= 1){
  11. if(ratioy < 1){
  12. ratiox = height * 1.0 / h;
  13. }else{
  14. if(ratiox > ratioy){
  15. ratiox = height * 1.0 / h;
  16. }else{
  17. ratiox = width * 1.0 / w;
  18. }
  19. }
  20. }else{
  21. if(ratioy < 1){
  22. if(ratiox > ratioy){
  23. ratiox = height * 1.0 / h;
  24. }else{
  25. ratiox = width * 1.0 / w;
  26. }
  27. }else{
  28. ratiox = width * 1.0 / w;
  29. }
  30. }
  31. /*
  32. * 对于图片的放大或缩小倍数计算完成,ratiox大于1,则表示放大,否则表示缩小
  33. */

这样,计算完的ratiox就是要压缩的比率。w、h是原图的width和height,而程序中的width和height是要得到图片的width和height。

在生成图片和其他的地方的程序是参考别人的,具体地址给忘了,再次谢过作者,以下是源代码:

  1. import java.awt.geom.AffineTransform;
  2. import java.awt.image.AffineTransformOp;
  3. import java.awt.image.BufferedImage;
  4. import java.io.File;
  5. import javax.imageio.ImageIO;
  6. public class UploadImg {
  7. String fromFileStr;
  8. String saveToFileStr;
  9. String sysimgfile;
  10. int width;
  11. int height;
  12. String suffix;
  13. /**
  14. * @param fromFileStr
  15. *            原始图片完整路径
  16. * @param saveToFileStr
  17. *            缩略图片保存路径
  18. * @param sysimgfilenNow
  19. *            处理后的图片文件名前缀
  20. *
  21. */
  22. public UploadImg(String fromFileStr, String saveToFileStr, String sysimgfile,String suffix,int width,int height) {
  23. this.fromFileStr = fromFileStr;
  24. this.saveToFileStr = saveToFileStr;
  25. this.sysimgfile = sysimgfile;
  26. this.width=width;
  27. this.height=height;
  28. this.suffix=suffix;
  29. }
  30. public boolean createThumbnail() throws Exception {
  31. // fileExtNmae是图片的格式 gif JPG 或png
  32. // String fileExtNmae="";
  33. File F = new File(fromFileStr);
  34. if (!F.isFile())
  35. throw new Exception(F
  36. + " is not image file error in CreateThumbnail!");
  37. File ThF = new File(saveToFileStr, sysimgfile +"."+suffix);
  38. BufferedImage buffer = ImageIO.read(F);
  39. /*
  40. * 核心算法,计算图片的压缩比
  41. */
  42. int w= buffer.getWidth();
  43. int h=buffer.getHeight();
  44. double ratiox = 1.0d;
  45. double ratioy = 1.0d;
  46. ratiox= w * ratiox / width;
  47. ratioy= h * ratioy / height;
  48. if( ratiox >= 1){
  49. if(ratioy < 1){
  50. ratiox = height * 1.0 / h;
  51. }else{
  52. if(ratiox > ratioy){
  53. ratiox = height * 1.0 / h;
  54. }else{
  55. ratiox = width * 1.0 / w;
  56. }
  57. }
  58. }else{
  59. if(ratioy < 1){
  60. if(ratiox > ratioy){
  61. ratiox = height * 1.0 / h;
  62. }else{
  63. ratiox = width * 1.0 / w;
  64. }
  65. }else{
  66. ratiox = width * 1.0 / w;
  67. }
  68. }
  69. /*
  70. * 对于图片的放大或缩小倍数计算完成,ratiox大于1,则表示放大,否则表示缩小
  71. */
  72. AffineTransformOp op = new AffineTransformOp(AffineTransform
  73. .getScaleInstance(ratiox, ratiox), null);
  74. buffer = op.filter(buffer, null);
  75. //从放大的图像中心截图
  76. buffer = buffer.getSubimage((buffer.getWidth()-width)/2, (buffer.getHeight() - height) / 2, width, height);
  77. try {
  78. ImageIO.write(buffer, suffix, ThF);
  79. } catch (Exception ex) {
  80. throw new Exception(" ImageIo.write error in CreatThum.: "
  81. + ex.getMessage());
  82. }
  83. return (true);
  84. }
  85. public static void main(String[] args) {
  86. UploadImg UI;
  87. boolean ss = false;
  88. try {
  89. UI = new UploadImg("C:\\Users\\Administrator\\Pictures\\111.jpg", "C:\\Users\\Administrator\\Pictures\\", "ps_low2","png",280,280);
  90. ss = UI.createThumbnail();
  91. if (ss) {
  92. System.out.println("Success");
  93. } else {
  94. System.out.println("Error");
  95. }
  96. } catch (Exception e) {
  97. System.out.print(e.toString());
  98. }
  99. }
  100. }

接下来测试几个例子:

原图1024*520:

要求得到尺寸:1000*500

  1. UI = new UploadImg("F:\\2.jpg", "F:\\", "ps","jpg",1000,500);

目标尺寸1000*700:

  1. UI = new UploadImg("F:\\2.jpg", "F:\\", "ps","jpg",1000,700);

目标尺寸:1100*600:

  1. UI = new UploadImg("F:\\2.jpg", "F:\\", "ps","jpg",1100,600);

目标尺寸600*500:

  1. UI = new UploadImg("F:\\2.jpg", "F:\\", "ps","jpg",600,500);

Java实现图片的裁剪(包括透明背景)的更多相关文章

  1. 图像处理-裁剪具有透明背景的png

    我遇到了需要裁剪具有透明背景的png的问题,用 https://www.yasuotu.com/editor 这个压缩图网站解决了问题. 这里可以选择裁剪的宽度和高度,记得点击确定按钮. 裁剪完成后, ...

  2. java对图片的裁剪(包括来自网络的图片)

    import java.awt.Rectangle; import java.awt.image.BufferedImage; import java.io.File; import java.io. ...

  3. Java实现图片的裁剪

    需求: 有一张位置大小的图片,现在需要根据这张原图得到指定尺寸的图片,且得到的图片要符合原先图片的比例,就是在原图的基础上等比例缩放得到图片后,在进行剪裁,这样保证得到的图片是原图的一部分,而不是将原 ...

  4. 前端问题——png图片在IE6下透明失效,解决办法

    今天,一位同事问我问题,png 图片在IE6下透明背景失效. 解决办法,在网上查了很多,最后还是采用两种方案来解决这个问题 1.把这个网页的png格式图片变更为gif格式的图片.问题解决 2.就是让这 ...

  5. Qt 制作透明背景图片与裁剪图片(很实用)

    这两天想做一个五子棋游戏,想从零开始自己绘制各种图片素材,将经验心得整理如下. 制作透明背景图片: void MyPainter::DrawKit() { QImage image(30, 30, Q ...

  6. vc下打印透明背景图片

    一.前言 刚接到个任务,要把带有透明背景的章子图片打印出来,开始觉得不是很简单吗,直接用vc自动生成的打印功能不就ok了.不过问题却不是想像的那么简单! 二.窗口中显示透明图片 在窗口中显示图片,可以 ...

  7. php 处理透明背景的图片时的问题

    PHP图象处理之透明背景的gif和png图片的一些问题 1,直接读取有透明背景的PNG格式文件,然后直接输出,背景变成了黑色,gif则没有这种情况.   解决方法:使用 imagesavealpha ...

  8. java多图片上传--前端实现预览--图片压缩 、图片缩放,区域裁剪,水印,旋转,保持比例。

    java多图片上传--前端实现预览 前端代码: https://pan.baidu.com/s/1cqKbmjBSXOhFX4HR1XGkyQ 解压后: java后台: <!--文件上传--&g ...

  9. 网页中PNG透明背景图片的完美应用

    PNG 图片在网站设计中是不可或缺的部分,最大的特点应该在于 PNG 可以无损压缩,而且还可以设置透明,对于增强网站的图片色彩效果有重要的作用. 但为什么 PNG 图片却没有 GIF 和 JPG 图片 ...

随机推荐

  1. 折腾newifi3 d2笔记

    1.忘记密码,恢复出厂 通电开机,等正常运行后,长按RESET大约6~8秒,见所有灯开始一起慢闪,可松手等重启就是出厂状态了,出厂IP是:192.168.99.1 2.免拆机刷breed 首先要打开s ...

  2. lombok踩坑与思考

    虽然接触到lombok已经有很长时间,但是大量使用lombok以减少代码编写还是在新团队编写新代码维护老代码中遇到的. 我个人并不主张使用lombok,其带来的代价足以抵消其便利,但是由于团队编码风格 ...

  3. [PHP] 常备的现代 PHP 项目开发准备

    [ Windows 开发环境 ] phpStudy(http://phpstudy.php.cn/) 现在一般选择版本: php7.1 + nginx,常用 curl.openssl 扩展选择打开. ...

  4. 求$N^N$的首位数字

    正如"大得多"定理所言,当$n\longrightarrow \infty$时: $$  n^n \gg n! \gg a^n \gg n^b \gg ln^kn $$ $f(n) = n^n$的增长 ...

  5. o2o、c2c、b2c、b2b、b2b2c都是什么?

    o2o:线上线下,如线上消费,线下享受服务,o2o是不需要物流的,是线上购买的东西,自己去线下获得.c2c:个人对个人,消费者与消费者之间的小成本交易,买卖双方都不是公司,如你在咸鱼上卖自己的东西.b ...

  6. 20175213 2018-2019-2 《Java程序设计》第8周学习总结

    教材学习内容总结 1:泛型主要目的是建立具有类型安全的集合框架,如链表,散列映射等数据结构. 泛型类的声明: class People<E> People是泛型类的名称,E是其中泛型,E可 ...

  7. 《转》完美解决微信video视频隐藏控件和内联播放问题

    地址:https://blog.csdn.net/xiao190128/article/details/81025378 var u = navigator.userAgent; var isAndr ...

  8. hibernate多生成一个外键以及映射文件中含有<list-index>标签

    (原文地址: http://blog.csdn.net/xiaoxian8023/article/details/15380529) 一.Inverse是hibernate双向关系中的基本概念.inv ...

  9. 一些用Css实现的效果

    今天写一个笔试题,其中有一个是用css实现直角梯形的效果,我给出的答案是: <style> .wrap{ width: 100px; height: 50px; border-top:90 ...

  10. LAB12 Transaction

    思路:就是把aotocommit()里面的东西改改就行了. 查询要求可用房间>=所需要的房间. SQL里面查数字时,不要加单引号.字符串才要. 查询里的set ONHAND=要改成自己的变量名s ...