Java_图片切片

package com.creditease.fetch.credit.util.similarity;

import java.awt.image.BufferedImage;
import java.util.ArrayList;
import java.util.List;

/**
 * 图片切割工具类
 */
public class ImageCuter {
    /**
     * 切割图片
     *
     * @param image     源文件
     * @param width     切片宽度
     * @param height    切片高度
     * @param rowsLimit 纵向切片总数
     * @param colsLimit 横向切片总数
     * @return
     * @throws Exception
     */
    public static List cut(BufferedImage image, int width, int height, Integer rowsLimit, Integer colsLimit){
        List list = new ArrayList<>();
        int sWidth = image.getWidth(); // 图片宽度
        int sHeight = image.getHeight(); // 图片高度
        if (sWidth > width && sHeight > height) {
            int cols = 0; // 横向切片总数
            int rows = 0; // 纵向切片总数
            int eWidth = 0; // 末端切片宽度
            int eHeight = 0; // 末端切片高度
            if (sWidth % width == 0) {
                cols = sWidth / width;
            } else {
                eWidth = sWidth % width;
                cols = sWidth / width + 1;
            }
            if (sHeight % height == 0) {
                rows = sHeight / height;
            } else {
                eHeight = sHeight % height;
                rows = sHeight / height + 1;
            }
            if (rowsLimit != null) {
                rows = rowsLimit;
            }
            if (colsLimit != null) {
                cols = colsLimit;
            }
            BufferedImage subImage = null;
            int cWidth = 0; // 当前切片宽度
            int cHeight = 0; // 当前切片高度
            for (int i = 0; i < rows; i++) {
                for (int j = 0; j < cols; j++) {
                    cWidth = getWidth(j, cols, eWidth, width);
                    cHeight = getHeight(i, rows, eHeight, height);
                    // x坐标,y坐标,宽度,高度
                    subImage = image.getSubimage(j * width, i * height, cWidth,
                            cHeight);
                    list.add(subImage);
                }
            }
        }
        return list;
    }

    /**
     * 获取当前切片的宽度
     *
     * @param index    横向索引
     * @param cols     横向切片总数
     * @param endWidth 末端切片宽度
     * @param width    切片宽度
     * @return
     */
    private static int getWidth(int index, int cols, int endWidth, int width) {
        if (index == cols - 1) {
            if (endWidth != 0) {
                return endWidth;
            }
        }
        return width;
    }

    /**
     * 获取当前切片的高度
     *
     * @param index     纵向索引
     * @param rows      纵向切片总数
     * @param endHeight 末端切片高度
     * @param height    切片高度
     * @return
     */
    private static int getHeight(int index, int rows, int endHeight, int height) {
        if (index == rows - 1) {
            if (endHeight != 0) {
                return endHeight;
            }
        }
        return height;
    }

    public static void main(String[] args) {
//        ImageCuter imageCuter = new ImageCuter();
//        try {
//            imageCuter.cut(new File("t5.jpg"), "E:\\test2\\", 16, 16);
//
//        } catch (Exception e) {
//            e.printStackTrace();
//        }
    }
}

Original: https://www.cnblogs.com/gisblogs/p/6823949.html
Author: GisClub
Title: Java_图片切片

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/537745/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • idea快捷键指南:让你开发效率蹭蹭蹭的上涨

    一文让你开发效率蹭蹭蹭的上涨(idea快捷键指南) 没有写使用说明的就表示没有特别的注意事项直接用就可以了。 Ctrl + Shift + A 说明:IDEA 把所有的可以执行的操…

    Java 2023年6月5日
    068
  • 演讲预告:Why Java Sucks and C# Rocks

    怎么样,这个标题是不是足够吸引眼球?嗯,我下个星期便打算在5173和博客园举办的技术交流会上讨论一下这个话题。原本这是一个为盛大创新院内部分享交流会准备的内容,不过正好5173要举…

    Java 2023年5月29日
    064
  • 金三银四跳槽季,教你这几招提高面试成功率

    一、面试前准备 参加面试除了携带必要的证书、文凭、照片等常规的用品以外,还应事先做些”功课”,归纳起来大概有一下几个方面的准备工作。 1.1 背熟自己的求职…

    Java 2023年6月7日
    072
  • 吃透SpringBoo的这些t知识,你就已经超过90%的Java面试者了

    做 Java 开发,没有人敢小觑 Spring Boot 的重要性,现在出去面试,无论多小的公司 or 项目,都要跟你扯一扯 Spring Boot,扯一扯微服务,如果啃不下来,很…

    Java 2023年6月7日
    070
  • 为什么说不变模式可以提高性能

    在Java中基础类型的包装类都是不可变的类,如Boolean、Byte、Character、Double、Float、Integer、Long、Short,另外还有String。这…

    Java 2023年6月6日
    071
  • 5.1SpringBoot整合Kafka(工具安装Kafka+Tools)

    1.工具安装Kafka 上一期我分享了安装zk,下一次我们把Kafka和可视化工具一起搞起来。 注意:这个时候ZK一定要启动成功。zk安装地址:https://www.cnblog…

    Java 2023年6月9日
    0120
  • webpack快速入门(三):资源管理

    上一章说了基本的webpack是用,包括命令行打包,npm脚本打包等基础的东西。 这篇说一下webpack的资源管理,包括(图片,字体,数据),首先调整一下项目结构成: webpa…

    Java 2023年6月16日
    097
  • 继承

    基本概念 扩充一个类已有的功能 优点 父类定义公共的内容,方便统一修改 整体减少代码量 添加新类方便 语法 class 子类 extends 父类{} 子类又叫派生类 父类又叫超类…

    Java 2023年6月6日
    077
  • 62进制在短链接场景的妙用

    假如要生成6位的字符 如何才能可靠的生成更多数据。 10进制 最大只能生成 10 ^ 6 – 1 = 999999个16进制 最大只能生成 16 ^ 6 –…

    Java 2023年6月16日
    081
  • 回溯问题学习总结

    回溯问题 三种情况 每种情况都有子集,组合,排列三种题型 无重复元素不可复选 //&#x5B50;&#x96C6;&#x95EE;&#x9898; …

    Java 2023年6月8日
    076
  • 线程的同步

    线程同步机制同步块:Java中提供了同步机制,可以有效的防止资源冲突。同步机制使用 synchronized关键字 使用该关键字的代码块称为同步块。同步块 语法: synchron…

    Java 2023年6月9日
    063
  • LinkedList源码分析

    Node节点类 Node节点用于指向上一个节点和下一个节点、还有存在在链表中的值 private static class Node { // 传入链表中的值 E item; //…

    Java 2023年6月16日
    051
  • 关于Springboot配置多数据源,这篇笔记太详细了!

    关于springboot配置多数据源,整理了这篇笔记,分享给有需要的小伙伴们,视频看的动力节点王鹤老师讲的springboot 目录结构 1. DataSourceConfigur…

    Java 2023年6月7日
    072
  • 【Unity Shader学习笔记】Unity基础纹理-渐变纹理

    纹理可以用来存储任何表面属性。 可以通过使用渐变纹理来实现插画风格的渲染效果。 这项技术是由Valve公司提出的。Valve使用它来渲染游戏中具有插画风格的角色。 我们使用半兰伯特…

    Java 2023年6月8日
    0100
  • SpringCloud : 多个 @FeignClient 注解 value 设置为同一个应用的解决方案

    Feign 版本10.1.0 Spring 版本 5.1.5.RELEASE SpringBoot 版本 2.1.5.RELEASE SpringCloud 版本 2.1.1.RE…

    Java 2023年5月30日
    065
  • 多线程 — H2O 生成、交替打印字符串

    现在有两种线程,氧 oxygen 和氢 hydrogen,你的目标是组织这两种线程来产生水分子。存在一个屏障(barrier)使得每个线程必须等候直到一个完整水分子能够被产生出来。…

    Java 2023年5月30日
    072
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球