zoukankan      html  css  js  c++  java
  • 图片类关于实现图片剪切功能的相关类的学习心得

    最近研究图片类,稍微总结一下,以后继续补充:

        今天上彀学了一下如何实现图片的剪切保存,也知道了相干类的操作,上面就来讲一下如何实现对一张图片实现剪切和重新保存。

        第一步:

        读取图片文件,这里用到的类是FileInputStream类,例如

              FileInputStream  fis  =  new FileInputStream(srcPath);  //srcPath为存放源图片的文件路径

        然后获得源图片的后缀名,因为前面的方法要用到后缀名,这里我们用以下方法可以获得后缀名:

               public String getPostfix(String inputFilePath) {
                return inputFilePath.substring(inputFilePath.lastIndexOf(".") + 1);
            }

        接下来就要用到Iterator泛型接口了:

                    Iterator<ImageReader> it = getImageReadersByFormatName(postFix);
                ImageReader reader = it.next();

        其中getImageReadersByFormatName(String postFix)方法是自定义的方法,就是一个可以根据后缀名返回包含所有当前已注册ImageReaderIterator,这些 ImageReader 宣称可以解码指定格式。

         该方法返回语句:return  ImageIO.getImageReadersByFormatName(postFix);//其中postFix为后缀名,这里有须要详细说一下Iterator接口,这个接口存在的目标是存放一系列的ImageReader类,所以这个接口并非很主要,而是其存放的元素很主要,那么ImageReader类都做了些什么工作呢?让sun公司挖空心思地设计了这个类呢?

        用来解析和解码图像的抽象超类。在 Java Image I/O 框架的上下文中读入图像的类必须创立此类的子类。

        ImageReader 对象通常由特定格式的服务提供者接口 (SPI) 类实例化。服务提供者类(例如 ImageReaderSpi 的实例)向IIORegistry 注册,后者应用前者进行格式识别和表示可用格式 reader 和 writer。

        在设置输入源时(应用 setInput 方法),可以将它标记为“只向前搜索”。此设置意味着包含在输入源中的图像将只按次序读取,可能答应 reader 避免缓存包含与以前已经读取的图像关联的数据的那些输入部份。

        所以这个类就是为了处理ImageInputStream图片输入流的。但是我们当初并没有创立ImageInputStream,所以接下来的一步是创立图片输入流,其实也就是把文件输入流作为图片输入流的参数,从而失掉了源图片的文件。

        第二步:

        创立图片输入流,也就是上面的语句:

        ImageInputStream  iis= ImageIO.createImageInputStream(fis); //fis是上文的文本输入流

        每日一道理
    如果说友谊是一颗常青树,那么,浇灌它的必定是出自心田的清泉;如果说友谊是一朵开不败的鲜花,那么,照耀它的必定是从心中升起的太阳。 多少笑声都是友谊唤起的,多少眼泪都是友谊揩干的。友谊的港湾温情脉脉,友谊的清风灌满征帆。友谊不是感情的投资,它不需要股息和分红。(友谊可以换其他词语)

        获得了图片输入流之后,就要利用到ImageReader类了,这个类有一个方法是setInput(Object input,boolean seekForwardOnly)是专门用于处理图片输入流的!

       reader.setInput(iis, true);  //reader就是上文中的ImageReader类

        至此已经失掉拥有准确的图片输入流的ImageReader对象了!接下来的工作就绝对简单了,只要可以对ImageReader对象进行准确的解码就能够了!

        ImageReadParam param = reader.getDefaultReadParam();

        上面是对ImageReadParam类的解释。

        

        

        

        

        ImageReadParam

        

        对象用于指定如何在输入时从 Java Image I/O 框架的上下文中的流转换一幅图像或一组图像。用于特定图像格式的插件将从其

        

        ImageReader

        

        实现的

        

        getDefaultReadParam

        

        方法中返回

        

        ImageReadParam

        

        的实例。

        

        如果我们要对图片进行剪切,上面是进行剪切的处理:

                     /*
                 * 图片裁剪区域。Rectangle 指定了坐标空间中的一个区域,通过 Rectangle 对象
                 * 的左上顶点的坐标(x,y)、宽度和高度可以定义这个区域。
                 */
                 Rectangle rect = new Rectangle(x, y, width, height);
                 // 提供一个 BufferedImage,将其用作解码像素数据的目标。
                 param.setSourceRegion(rect);

        至此工作已经基本完成了,那么我们如何返回一个修改当时的图像呢?这个实现类似功能的方法还是ImageReader对象提供的。

                    /*
                 * 应用所提供的 ImageReadParam 读取通过索引 imageIndex 指定的对象,并将 它作为一个完整的
                 * BufferedImage 返回。
                 */
                
    BufferedImage bi = reader.read(0, param);
                 // 保存新图片
                
    ImageIO.write(bi, postFix, new File(subpath + "_" + new Date().getTime() + "." + postFix));

        其中subpath就是存放新文件的路径名。

        最后一步就是关闭图像输入流和文件输入流的工作。

        

    文章结束给大家分享下程序员的一些笑话语录: 腾讯总舵主马化腾,有人曾经戏称如果在Z国选举总统,马化腾一定当选,因为只要QQ来一个弹窗”投马总,送Q币”即可。

    --------------------------------- 原创文章 By
    图片和类
    ---------------------------------

  • 相关阅读:
    Ceph中的容量计算与管理
    Ceph Monitor基础架构与模块详解
    Ceph:pg peering过程分析
    API调用过程
    Windows内核—保护模式
    逆向笔记——C、C++对应的汇编结构(一)
    2020年内网渗透培训:红队攻防
    2020年 初级渗透工程师【Web安全方向】
    渗透测试【网络安全】入门指南【20190607】
    渗透学习问题【一】遇到坑需要停下来补吗
  • 原文地址:https://www.cnblogs.com/xinyuyuanm/p/3097632.html
Copyright © 2011-2022 走看看