项目中用到,用来对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. 音频处理库—librosa的安装与使用

    序言 Librosa是一个用于音频.音乐分析.处理的python工具包,一些常见的时频处理.特征提取.绘制声音图形等功能应有尽有,功能十分强大.本文主要介绍librosa的安装与使用方法. 一.lib ...

  2. Spring Boot 返回 XML 数据,一分钟搞定!

    Spring Boot 返回 XML 数据,前提必须已经搭建了 Spring Boot 项目,所以这一块代码就不贴了,可以点击查看之前分享的 Spring Boot 返回 JSON 数据,一分钟搞定! ...

  3. .NET图平台下的图像处理工具---强大的Emgucv

    图像一直与时代相伴,图形化的应用软件也重不可缺.对于MFC.Delphi.Lazarus.Qt大家可能已经耳熟能详.对于很多图像处理的开源库,很多都是用C\C++写的,而.Net下的开源库以前很少了解 ...

  4. NLog 自定义Target

    http://nlog-project.org/2015/06/30/extending-nlog-is-easy.html 新建一个类库,命名规则为NLog.*.dll 定义一个类输出日志到Rabb ...

  5. Mac下快速搭建PHP开发环境

    最近做了一个后端的项目,是用PHP+MySQL+Nginx做的,所以把搭建环境的方法简单总结一下. 备注: 物料:Apache/Nginx+PHP+MySQL+MAMP Mac OS 10.12.1 ...

  6. 【干货】利用MVC5+EF6搭建博客系统(三)添加Nlog日志、缓存机制(MemoryCache、RedisCache)、创建控制器父类BaseController

    PS:如果图片模糊,鼠标右击复制图片网址,然后在浏览器中打开即可. 一.回顾系统进度以及本章概要 目前博客系统已经数据库创建.以及依赖注入Autofac集成,接下来就是日志和缓存集成,这里日志用的是N ...

  7. 各个系统下ping IP+端口的方法

    前言 做开发的人员,可能都会遇到网络的一些问题.这时一般都需要测试指定的网络是否能正常访问.通常在windows系统下,在cmd里直接用命令ping指定的IP或者域名就可以快速的知道这个地址是否是可以 ...

  8. 用POLARDB构建客到智能餐饮系统实践

    在新零售成为大趋势的今天,餐饮行业也加入到这一浪潮之中.智能餐饮系统将帮助餐饮行业从多个维度提升自己的运营能力和收益,而打造智能餐饮系统SaaS化能力也成为了目前的一个热点.本文中果仁软件联合创始人& ...

  9. Webapi--Webapi 跨域链接

    1]创建 WebAPIWebAPI WebAPI,新建 ,新建 ->项目 ->ASP.NET Web >ASP.NET Web >ASP.NET Web >ASP.NET ...

  10. ____利用C#特性Attribute完成对sql语句的拼接

    //定义 特性类: public class MyAttribute : Attribute//自定义注解类判断是否是主键 { public bool PrimaryKey = false; publ ...