如何用Javafx开发一个图片剪裁器

需求

        在微信生态圈内,图片需要符合9:5的标准,常见的大小包括600*275、900*500等。为了满足需求,需要开发一个照片剪裁器,能够按照选定的标准进行照片剪裁。

分析

        图片的剪裁就是截取图片的部分内容(矩形区域)并进行保存,例如截取一个1024*768图片中坐标为(100, 100),宽为900, 长度为500的区域,可以分为两个步骤:选择所截取的区域(位置和大小),然后进行图片信息截取。

实现原理

        Javafx提供照片处理的API接口包括两个:Image和ImageView。其中前者负责存储照片数据,后者提供显示。当然,ImageView所显示的图片信息来源就是Image中所存储的图片信息。

        ImageView对图片的局部显示功能有两个:Clip和Viewport。Clip是ImageView继承自Node的功能,它是对ImageView所显示的内容进行截取,而ViewPort则是对Image数据进行截取后再提供给ImageView进行显示,两者的区别如下:


        从上图中可以看出,Clip是对ImageView设置一个显示区域,所以能够很容易的实现所见即所取。而Viewport是对Image设置一个显示区域,然后再通过ImageView进行显示,所以所设置的Viewport和所显示的内容会发生变化,因为ImageView对Image进行显示时,会根据平移、缩放、旋转等参数进行计算后再进行显示。当然在转换参数都不存在时,它们是一致的。

        然而,直接通过对Image设置截取范围,由于比通过ImageView,然后再通过Clip设置截取范围要直接得多, 所以性能要高出多。特别是进行批量自动截取(根据预先设定好的截取条件,同时选择多个文件进行截取)功能会产生很大的性能影响,因为Viewport方式不需要ImageView就可以工作,而ImageView由于需要提供图片信息的显示功能,而这是对系统资源占用最大的工作。

        所以采用Viewport方式的本质是直接在底片上截取,生成新的底片。而Clip则是在照片上进行截取,然后再翻拍生成新的底片。

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 每次看到喜欢的景色,喜欢的人文习俗,喜欢的建筑,总想着往那边跑,但是总因为没有时间,没有钱而让脚步停留在原地。 都...
    龙猫的米儿阅读 131评论 0 0
  • 文/michaelgbw js作为一个“几乎统治宇宙”的语言,不光是对于我们web工程师来说,几乎所有领域的程序员...
    michaelgbw阅读 527评论 0 5
  • 【单词】 rip:[I,T]to tear something or be torn quickly and vi...
    吉米妈妈阅读 553评论 0 0