当前位置:首页 > Java

java yuv 如何裁剪

2026-03-25 09:40:32Java

YUV 图像裁剪方法

YUV 图像裁剪需要根据 YUV 格式(如 I420/NV12/NV21)处理不同分量的数据。以下以常见的 I420(YUV420P) 为例说明裁剪步骤:

获取原始参数

假设原始图像宽度为 srcWidth,高度为 srcHeight。目标裁剪区域左上角坐标为 (x, y),裁剪宽度为 cropWidth,高度为 cropHeight

java yuv 如何裁剪

裁剪 Y 分量(亮度)

Y 分量是完整分辨率,每个像素占 1 字节。裁剪时直接从原始数据中按行复制:

java yuv 如何裁剪

byte[] srcY = ...; // 原始 Y 数据
byte[] dstY = new byte[cropWidth * cropHeight];
for (int row = 0; row < cropHeight; row++) {
    System.arraycopy(
        srcY, (y + row) * srcWidth + x, // 源起始位置
        dstY, row * cropWidth,          // 目标起始位置
        cropWidth                       // 复制长度
    );
}

裁剪 UV 分量(色度)

I420 的 UV 分量是 2x2 下采样的,分辨率减半。裁剪时需注意坐标和跨距:

// U/V 分量宽高为原图 1/2
int uvSrcWidth = srcWidth / 2;
int uvSrcHeight = srcHeight / 2;
int uvCropWidth = cropWidth / 2;
int uvCropHeight = cropHeight / 2;

byte[] srcU = ...; // 原始 U 数据
byte[] dstU = new byte[uvCropWidth * uvCropHeight];
for (int row = 0; row < uvCropHeight; row++) {
    System.arraycopy(
        srcU, (y/2 + row) * uvSrcWidth + x/2,
        dstU, row * uvCropWidth,
        uvCropWidth
    );
}
// V 分量同理

NV12/NV21 处理

对于 NV12/NV21(半平面格式),UV 交错存储:

byte[] srcUV = ...; // NV12: UV交错数据
byte[] dstUV = new byte[cropWidth * cropHeight / 2];
int uvRowBytes = cropWidth; // 每行字节数(2字节 per UV像素)
for (int row = 0; row < cropHeight / 2; row++) {
    System.arraycopy(
        srcUV, (y/2 + row) * srcWidth + x,
        dstUV, row * uvRowBytes,
        uvRowBytes
    );
}

注意事项

  1. 坐标对齐:YUV420 要求裁剪的 xywidthheight 必须是偶数,否则会破坏色度采样结构。
  2. 性能优化:大数据量时可使用 ByteBuffer 或 JNI 加速处理。
  3. 格式差异:YUV422 或 YUV444 等格式需调整色度分量裁剪逻辑。

标签: javayuv
分享给朋友:

相关文章

java如何获取当前时间

java如何获取当前时间

获取当前时间的方法 在Java中,可以通过多种方式获取当前时间。以下是几种常见的方法: 使用 java.util.Date Date currentDate = new Date(); Syste…

java如何解决高并发

java如何解决高并发

Java 高并发解决方案 使用线程池优化资源管理 线程池(如 ThreadPoolExecutor)能避免频繁创建和销毁线程的开销。通过核心线程数、最大线程数和任务队列的合理配置,可以平衡系统负载。例…

java中如何获取当前时间

java中如何获取当前时间

获取当前时间的几种方法 使用 java.time 包(Java 8及以上推荐) import java.time.LocalDateTime; LocalDateTime currentTime =…

如何导入java项目

如何导入java项目

导入Java项目的方法 使用IDE导入(如IntelliJ IDEA或Eclipse) 打开IDE后选择导入现有项目,导航至项目根目录(包含pom.xml或build.gradle的文件位置)。IDE…

如何学习好java

如何学习好java

掌握Java基础知识 学习Java的第一步是掌握其基础知识,包括数据类型、变量、运算符、控制流语句(如if-else、for循环、while循环)以及数组。这些是构建更复杂程序的基石。可以通过在线教程…

java如何创建文件

java如何创建文件

创建文件的方法 在Java中创建文件可以通过多种方式实现,以下是常见的几种方法: 使用File.createNewFile()方法 这种方法适用于简单的文件创建需求。需要先创建一个File对象,然…