对YUV数据进行裁剪
项目中用到,用来对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数据进行裁剪的更多相关文章
- ffmpeg从AVFrame取出yuv数据到保存到char*中
ffmpeg从AVFrame取出yuv数据到保存到char*中 很多人一直不知道怎么利用ffmpeg从AVFrame取出yuv数据到保存到char*中,下面代码将yuv420p和yuv422p的数 ...
- 入门视频采集与处理(学会分析YUV数据)
做视频采集与处理,自然少不了要学会分析YUV数据.因为从采集的角度来说,一般的视频采集芯片输出的码流一般都是YUV数据流的形式,而从视频处理(例如H.264.MPEG视频编解码)的角度来说,也是在原始 ...
- Android上使用OpenGLES2.0显示YUV数据
在Android上用OpenGLES来显示YUV图像,之所以这样做,是因为: 1.Android本身也不能直接显示YUV图像,YUV转成RGB还是必要的: 2.YUV手动转RGB会占用大量的CPU资源 ...
- Android用surface直接显示yuv数据(二)
上一篇文章主要是參照AwesomePlayer直接用SoftwareRenderer类来显示yuv,为了能用到这个类,不惜依赖了libstagefright.libstagefright_color_ ...
- Android使用surface直接显示yuv数据(三)
在本文中,Java创建UI和关节JNI经营层surface直接显示yuv数据(yv12).发展环境Android 4.4,驰A23平台. package com.example.myyuvviewer ...
- 学会分析YUV数据
做视频采集与处理,自然少不了要学会分析YUV数据.因为从采集的角度来说,一般的视频采集芯片输出的码流一般都是YUV数据流的形式,而从视频处理(例如H.264.MPEG视频编解码)的角度来说,也是在原始 ...
- Android camera2 回调imagereader 从Image拿到YUV数据转化成RGB,生成bitmap并保存
ImageUtil.java import android.graphics.ImageFormat; import android.media.Image; import android.os.Bu ...
- (转) 从ffmpeg中提取出YUV数据
有时需要从ffmpeg中提取出YUV数据用作预览,另存什么的. ffmpeg是先解码成YUV, 再以这个YUV作为输入进行编码,所以YUV数据有两种: 解码后的YUV数据, 以及 编码重建的YUV ...
- ffmpeg最简单的解码保存YUV数据 <转>
video的raw data一般都是YUV420p的格式,简单的记录下这个格式的细节,如有不对希望大家能指出. YUV图像通常有两种格式,一种是packet 还有一种是planar 从字面上 ...
随机推荐
- 整理+学习《骆昊-Java面试题全集(上)》
★可以关注微信公众号,了解更多技术和行业信息 2013年年底的时候,我看到了网上流传的一个叫做<Java面试题大全>的东西,认真的阅读了以后发现里面的很多题目是重复且没有价值的题目,还有不 ...
- 如何使用Keras的Model visualization功能
问题 安装上graphviz和pydot之后调用出现如下问题 ['dot', '-Tpng', '/tmp/tmp1KPaiV'] return code: 1 stdout, stderr: War ...
- mysql 开发进阶篇系列 19 MySQL Server(innodb_flush_log_at_trx_commit与sync_binlog)
一. innodb_flush_log_at_trx_commit 这个参数名称有个log,一看就是与日志有关.是指:用来控制缓冲区(log buffer)中的数据写入到日志文件(log file), ...
- 2015 CALLED THE INTERFACE OF 2014
Writer:BYSocket(泥沙砖瓦浆木匠) 微博:BYSocket 豆瓣:BYSocket Reprint it anywhere u want. ”Hi , Happy New Year.Wr ...
- ⑦JSP2.0的福利(标签文件)
前言 本篇接着上一篇博客:[传送门] 这次讲的是JSP2.0的特性之一,我们可以编写标签文件,指没有标签处理器和标签类库描述符的定制动作指令,不编译,无标签类描述符. 本文结构: ①标签文件简介 ②第 ...
- [机器学习]梯度提升决策树--GBDT
概述 GBDT(Gradient Boosting Decision Tree) 又叫 MART(Multiple Additive Regression Tree),是一种迭代的决策树算法,该算法由 ...
- Go的50度灰:开发者要注意的陷阱和常见错误
Go是一门简单有趣的语言,但与其他语言类似,它会有一些技巧...这些技巧的绝大部分并不是Go的缺陷造成的.如果你以前使用的是其他语言,那么这其中的有些错误就是很自然的陷阱.其它的是由错误的假设和缺少细 ...
- Pytorch1.0入门实战一:LeNet神经网络实现 MNIST手写数字识别
记得第一次接触手写数字识别数据集还在学习TensorFlow,各种sess.run(),头都绕晕了.自从接触pytorch以来,一直想写点什么.曾经在2017年5月,Andrej Karpathy发表 ...
- 一张图读懂PBN飞越转弯衔接DF航段计算
飞越转弯衔接TF航段时,转弯外边界与旁切转弯相似,只是在拐角位置直接以风螺旋绘制外边界,大部分切点可以精确计算得到. 飞越转弯衔接DF航段时,转弯外边界全部由风螺旋和它的切线构成,又会有哪些神奇的事情 ...
- [总结] Min-Max容斥学习笔记
min-max 容斥 给定集合 \(S\) ,设 \(\max(S)\) 为 \(S\) 中的最大值,\(\min(S)\) 为 \(S\) 中的最小值,则: \[\max(S)=\sum_{T\in ...