Java中如何通过坐标裁剪3D图像?自定义裁剪函数实现咨询
Java 3D图像按坐标裁剪实现方案
Java完全可以通过坐标实现3D图像的指定区域裁剪,针对你给出的函数签名,实现逻辑如下:
前置说明
- 假设你定义的
int[][][] img数组维度为[高度维度i][宽度维度j][图像通道数],符合常规3D图像存储规则,比如RGB图像第三维长度为3,分别对应红、绿、蓝通道数值 - 所有坐标默认从0开始计数,裁剪范围的对角点坐标默认满足
i_2 >= i_1、j_2 >= j_1,且裁剪区域完全落在原图像的合法边界内
实现步骤
- 合法性校验:先判断输入图像和坐标是否合法,避免触发数组越界异常
- 初始化新3D数组:按照要求的尺寸
(i_2 - i_1 + 1) * (j_2 - j_1 + 1)创建新数组,通道数与原图像保持一致 - 像素值拷贝:遍历原图像裁剪范围内的所有像素,按偏移位置赋值到新数组中
完整代码实现
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
相关产品推荐
相关产品推荐

