如何用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进行显示,两者的区别如下:


如何用Javafx开发一个图片剪裁器_第1张图片

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

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

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

你可能感兴趣的:(如何用Javafx开发一个图片剪裁器)