对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 从字面上 ...
随机推荐
- 搭建gitlab本地服务
一本正经的搞事情 改变懒惰,成就心中的自己,并非难事 博客园 首页 新随笔 联系 管理 订阅 随笔- 40 文章- 0 评论- 5 gitlab服务部署及使用 目录 一.什么是gitlib ...
- vue webpack配置解决跨域问题
现在基本项目都是实行前后端分离的原则,不管是ng 或者是vue 在开发中都无法避免跨域的这个问题 本人刚上手第一个vue项目,在调用api的时候出现了跨域的这个问题 这是封装好一个简单的post 请求 ...
- app 压力测试
monkey工具详解 https://blog.csdn.net/jffhy2017/article/details/54572400 ----------------------- Android ...
- java设定一个日期时间,加几分钟(小时或者天)后得到新的日期
//返回的是字符串型的时间,输入的 //是String day, int x public static String addDateMinut(String day, int x){ SimpleD ...
- [Android 泥水匠] Android基础 之一:浅谈Android架构到HelloWorld案例的剖析
作者:泥沙砖瓦浆木匠网站:http://blog.csdn.net/jeffli1993个人签名:打算起手不凡写出鸿篇巨作的人,往往坚持不了完成第一章节. 交流QQ群:[编程之美 365234583] ...
- 在.net core 中PetaPoco结合EntityFrameworkCore使用codefirst方法进行开发
在.net core开发过程中,使用最多的就是注入方法.但是在.net core使用PetaPoco时,PetaPoco还不支持进行注入方式进行处理一些问题. 今天对PetaPoco进行了一些扩展,可 ...
- SharePoint如何配置Ipad跳转等问题
如何配置Ipad跳转 Apple iPad 设备上不支持 SharePoint 标准视图.用户可以改用移动视图在 iPad 设备上查看 SharePoint 内容.默认情况下,iPad 用户被重定向到 ...
- 基于jQuery消息提示框插件Tipso
今天要分享的这款jQuery消息提示框插件名叫Tipso,它的特点是可以定义提示框的显示位置,以及动态改变提示框的提示内容,应该说是一款相当灵活的jQuery消息提示框插件.效果图如下: 在线预览 ...
- npm设置和查看仓库源
转载请注明出处:https://www.cnblogs.com/wenjunwei/p/10078460.html 在使用npm命令时,如果直接从国外的仓库下载依赖,下载速度很慢,甚至会下载不下来,我 ...
- Spark提高篇——RDD/DataSet/DataFrame(一)
该部分分为两篇,分别介绍RDD与Dataset/DataFrame: 一.RDD 二.DataSet/DataFrame 先来看下官网对RDD.DataSet.DataFrame的解释: 1.RDD ...