项目中用到,用来对YUV数据(图片的yuv或者视频单帧yuv数据)进行裁剪。

格式介绍:http://blog.csdn.net/vblittleboy/article/details/10945143

import android.graphics.RectF;
import android.util.Log; /**
* 用来裁剪yuv图像
* @author willhua
*
*/
public class YuvCroper {
private static String LOG_TAG = "VideoCrop";
public static int YUV_420SP = 0; //也即NV12 YYY...UVUVUV...
public static int YUV_420P = 1; //也即I420 YYY...UUU...VVV... private final int mType;
private byte[] mData;
private final int mWidth;
private final int mHeight;
private final int mYLenght;
private final int mCropLeft;
private final int mCropTop;
private int mCropWidth;
private int mCropHeight; /**
*
* @param type yuv数据类型:YUV_SP() YUV_420P()
* @param width yuv数据的原始宽度
* @param height yuv数据的原始高度
* @param crop 裁剪的区域。比如(0.25,0,1,0.85),每个值都在0-1之间
* @throws Exception
*/
public YuvCroper(int type, int width, int height, RectF crop) throws Exception{
if(width <= 0 || height <= 0 || crop == null || crop.width() <= 0 || crop.height() <= 0){
throw new Exception("ViewCrop:Wrong param! size:" + width + "*" + height + ". Crop:"+ crop);
}
mType = type;
mWidth = width;
mHeight = height;
mYLenght = mWidth * mHeight;
mCropHeight = (int)(crop.height() * mHeight);
mCropWidth = (int)(crop.width() * mWidth);
mCropHeight = roundTo16(mCropHeight, mHeight);
mCropWidth = roundTo16(mCropWidth, mWidth);
mCropLeft = (int)(crop.left * mWidth) / 16 * 16;
mCropTop = (int)(crop.top * mHeight) / 16 * 16;
mData = new byte[mCropHeight * mCropWidth * 3 / 2];
Log.d(LOG_TAG, "crop point:" + mCropLeft + "*" + mCropTop + " size:" + mCropWidth + "*" + mCropHeight);
} /**
* 单帧yuv数据
* @param oriData
* @return
*/
public byte[] crop(byte[] oriData){
if(oriData == null || oriData.length != mYLenght * 3 / 2){
Log.d(LOG_TAG, "crop:wrong oriData!!!");
return mData;
}
if(mType == YUV_420SP){
processYuvsp(oriData);
}else if(mType == YUV_420P){
processYuv420p(oriData);
}
return mData;
} private void processYuvsp(byte[] oriData){
//copy y;
int index = 0;
int start = mCropLeft + mWidth * mCropTop;
int end = mWidth * (mCropTop + mCropHeight);
int oriStep = mWidth;
int newstep = mCropWidth;
index = copy(oriData, start, end, oriStep, newstep, index); //copy uv
start = mYLenght + mWidth * mCropTop / 2 + mCropLeft;
end = mYLenght + mWidth * (mCropTop + mCropHeight) / 2;
oriStep = mWidth;
newstep = mCropWidth;
copy(oriData, start, end, oriStep, newstep, index);
} private void processYuv420p(byte[] oriData){
int index = 0;
int start = mCropLeft + mCropTop * mWidth;
int end = mWidth * (mCropTop + mCropHeight);
int oriStep = mWidth;
int newstep = mCropWidth;
//copy y;
index = copy(oriData, start, end, oriStep, newstep, index); //copy u
start = mYLenght + (mWidth * mCropTop / 4 + mCropLeft / 2) ;
end = mYLenght + mWidth * (mCropTop + mCropHeight) / 4;
oriStep = mWidth / 2;
newstep = mCropWidth / 2;
index = copy(oriData, start, end, oriStep, newstep, index); //copy v
start = mYLenght / 4 * 5 + mWidth * mCropTop / 4 + mCropLeft / 2;
end = mYLenght / 4 * 5 + mWidth * (mCropTop + mCropHeight) / 4;
copy(oriData, start, end, oriStep, newstep, index);
} private int copy(byte[] oriData, int start, int end, int oriStep, int newstep, int index){
for(int i = start; i < end; i += oriStep){
System.arraycopy(oriData, i, mData, index, newstep);
index += newstep;
}
return index;
} /**
* 对于高通或者MTK平台,只支持宽高为16的整数备的数据
* @param size
* @param limit
* @return
*/
private int roundTo16(int size, int limit){
if(size >= limit){
return limit;
}
float f = size / 16f;
int m;
if(f - (int)f > 0.5f){
m = ((int)(f + 0.5)) * 16;
}else{
m = (int)f * 16;
}
return m < 16 ? 16 : m;
} }

对YUV数据进行裁剪的更多相关文章

  1. ffmpeg从AVFrame取出yuv数据到保存到char*中

    ffmpeg从AVFrame取出yuv数据到保存到char*中   很多人一直不知道怎么利用ffmpeg从AVFrame取出yuv数据到保存到char*中,下面代码将yuv420p和yuv422p的数 ...

  2. 入门视频采集与处理(学会分析YUV数据)

    做视频采集与处理,自然少不了要学会分析YUV数据.因为从采集的角度来说,一般的视频采集芯片输出的码流一般都是YUV数据流的形式,而从视频处理(例如H.264.MPEG视频编解码)的角度来说,也是在原始 ...

  3. Android上使用OpenGLES2.0显示YUV数据

    在Android上用OpenGLES来显示YUV图像,之所以这样做,是因为: 1.Android本身也不能直接显示YUV图像,YUV转成RGB还是必要的: 2.YUV手动转RGB会占用大量的CPU资源 ...

  4. Android用surface直接显示yuv数据(二)

    上一篇文章主要是參照AwesomePlayer直接用SoftwareRenderer类来显示yuv,为了能用到这个类,不惜依赖了libstagefright.libstagefright_color_ ...

  5. Android使用surface直接显示yuv数据(三)

    在本文中,Java创建UI和关节JNI经营层surface直接显示yuv数据(yv12).发展环境Android 4.4,驰A23平台. package com.example.myyuvviewer ...

  6. 学会分析YUV数据

    做视频采集与处理,自然少不了要学会分析YUV数据.因为从采集的角度来说,一般的视频采集芯片输出的码流一般都是YUV数据流的形式,而从视频处理(例如H.264.MPEG视频编解码)的角度来说,也是在原始 ...

  7. Android camera2 回调imagereader 从Image拿到YUV数据转化成RGB,生成bitmap并保存

    ImageUtil.java import android.graphics.ImageFormat; import android.media.Image; import android.os.Bu ...

  8. (转) 从ffmpeg中提取出YUV数据

    有时需要从ffmpeg中提取出YUV数据用作预览,另存什么的. ffmpeg是先解码成YUV, 再以这个YUV作为输入进行编码,所以YUV数据有两种:  解码后的YUV数据, 以及  编码重建的YUV ...

  9. ffmpeg最简单的解码保存YUV数据 <转>

    video的raw data一般都是YUV420p的格式,简单的记录下这个格式的细节,如有不对希望大家能指出.   YUV图像通常有两种格式,一种是packet 还有一种是planar    从字面上 ...

随机推荐

  1. 线性整流函数(ReLU)

    线性整流函数(Rectified Linear Unit, ReLU),又称修正线性单元, 是一种人工神经网络中常用的激活函数(activation function),通常指代以斜坡函数及其变种为代 ...

  2. 原生js的简单倒计时

    <!DOCTYPE html><html><head> <meta charset="UTF-8"> <title>倒计 ...

  3. 利用max-height适应多尺寸屏幕的下拉动画

    移动设备的特点之一便是屏幕尺寸多种多样,所以我们在制作针对移动设备的动画时必须不同尺寸屏幕的兼容性.比如我们要制作以下动画:红框2为详细内容,默认收起:红框1处为事件响应热区,点击后展开或收起红框2的 ...

  4. SpringCloud实战10-Sleuth

    Spring-Cloud-Sleuth是Spring Cloud的组成部分之一,为SpringCloud应用实现了一种分布式追踪解决方案,其兼容了Zipkin, HTrace和log-based追踪, ...

  5. 【Go】strings.Replace 与 bytes.Replace 调优

    原文链接:https://blog.thinkeridea.com/201902/go/replcae_you_hua.html 标准库中函数大多数情况下更通用,性能并非最好的,还是不能过于迷信标准库 ...

  6. 第2章 细说Linux系统用户/组管理(1)

    2.1 用户和组的基本概念 用户和组是操作系统中一种身份认证资源. 每个用户都有用户名.用户的唯一编号uid(user id).所属组及其默认的shell,可能还有密码.家目录.附属组.注释信息等. ...

  7. JavaScript 系列博客(三)

    JavaScript 系列博客(三) 前言 本篇介绍 JavaScript 中的函数知识. 函数的三种声明方法 function 命令 可以类比为 python 中的 def 关键词. functio ...

  8. js_ajax模拟form表单提交_多文件上传_支持单个删除

    需求场景: 用一个input type="file"按钮上传多张图片,可多次上传,可单独删除,最后使用ajax模拟form表单提交功能提交到指定方法中: 问题:由于只有一个file ...

  9. 12个非常有用的JavaScript技巧

    在这篇文章中,我将分享12个非常有用的JavaScript技巧.这些技巧可以帮助你减少并优化代码. 1) 使用!!将变量转换成布尔类型 有时,我们需要检查一些变量是否存在,或者它是否具有有效值,从而将 ...

  10. C#设计模式之十三模板方法模式(Template Method Pattern)【行为型】

    一.引言 “结构型”的设计模式已经写完了,从今天我们开始讲“行为型”设计模式.现在我们开始讲[行为型]设计模式的第一个模式,该模式是[模板方法],英文名称是:Template Method Patte ...