You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Java中如何通过坐标裁剪3D图像?自定义裁剪函数实现咨询

Java 3D图像按坐标裁剪实现方案

Java完全可以通过坐标实现3D图像的指定区域裁剪,针对你给出的函数签名,实现逻辑如下:

前置说明

  • 假设你定义的int[][][] img数组维度为[高度维度i][宽度维度j][图像通道数],符合常规3D图像存储规则,比如RGB图像第三维长度为3,分别对应红、绿、蓝通道数值
  • 所有坐标默认从0开始计数,裁剪范围的对角点坐标默认满足i_2 >= i_1、j_2 >= j_1,且裁剪区域完全落在原图像的合法边界内

实现步骤

  1. 合法性校验:先判断输入图像和坐标是否合法,避免触发数组越界异常
  2. 初始化新3D数组:按照要求的尺寸(i_2 - i_1 + 1) * (j_2 - j_1 + 1)创建新数组,通道数与原图像保持一致
  3. 像素值拷贝:遍历原图像裁剪范围内的所有像素,按偏移位置赋值到新数组中

完整代码实现

public static int[][][] crop(int[][][] img, int i_1, int j_1, int i_2, int j_2) {
    // 参数合法性校验
    if (img == null || img.length == 0 || img[0].length == 0) {
        throw new IllegalArgumentException("输入图像不能为空");
    }
    int originHeight = img.length;
    int originWidth = img[0].length;
    int channels = img[0][0].length;
    if (i_1 < 0 || i_2 >= originHeight || j_1 <0 || j_2 >= originWidth || i_2 < i_1 || j_2 < j_1) {
        throw new IllegalArgumentException("裁剪坐标不合法");
    }

    // 计算新图像尺寸
    int newHeight = i_2 - i_1 + 1;
    int newWidth = j_2 - j_1 + 1;
    // 初始化结果数组
    int[][][] croppedImg = new int[newHeight][newWidth][channels];

    // 遍历拷贝像素
    for (int i = i_1; i <= i_2; i++) {
        for (int j = j_1; j <= j_2; j++) {
            // 计算新数组的坐标偏移
            int newI = i - i_1;
            int newJ = j - j_1;
            // 批量拷贝所有通道数值,性能优于手动遍历通道
            System.arraycopy(img[i][j], 0, croppedImg[newI][newJ], 0, channels);
        }
    }
    return croppedImg;
}

注意事项

如果你的3D数组维度定义和上述假设不同(比如第一维是通道数),只需要调整遍历顺序和新数组的维度定义即可,核心的坐标偏移逻辑不需要改动。

内容的提问来源于stack exchange,提问作者Ronin Saad

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.25 01:06:11