`
fable0618
  • 浏览: 47576 次
  • 性别: Icon_minigender_2
  • 来自: 火星
文章分类
社区版块
存档分类

yuv格式图像旋转

阅读更多
#include <string.h>
#include <android/log.h>
#include <assert.h>
#include <jni.h>

#include <stdio.h>
#include <stdint.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>

#include <unistd.h>
#include <sys/socket.h>
#include <sys/un.h>
#include <errno.h>

#include "include/libyuv.h"

#define LOG_TAG "kylin_yuv_format"
#define LOGD(...) __android_log_print(ANDROID_LOG_DEBUG, LOG_TAG, __VA_ARGS__)
#define LOGE(...) __android_log_print(ANDROID_LOG_ERROR, LOG_TAG, __VA_ARGS__)
#define LOGI(...) __android_log_print(ANDROID_LOG_INFO, LOG_TAG, __VA_ARGS__)

void yuv_rotate_90(uint8* des,uint8* src,int width,int height)
{
   int n = 0;
   int hw = width / 2;
   int hh = height / 2;
   //copy y
   for(int j = 0; j < width;j++)
   {
       for(int i = height - 1; i >= 0; i--)
       {
           des[n++] = src[width * i + j];
       }
   }

   //copy u
   uint8 *ptemp = src + width * height;
   for(int j = 0;j < hw;j++)
   {
       for(int i = hh - 1;i >= 0;i--)
       {
           des[n++] = ptemp[ hw*i + j ];
       }
   }

   //copy v
   ptemp += width * height / 4;
   for(int j = 0; j < hw; j++)
   {
       for(int i = hh - 1;i >= 0;i--)
       {
           des[n++] = ptemp[hw*i + j];
       }
   }
}

void yuv_rotate_180(uint8* des,uint8* src,int width,int height)
{
   int n = 0;
   int hw = width / 2;
   int hh = height / 2;
   //copy y
   for(int j = height - 1; j >= 0; j--)
   {
       for(int i = width; i > 0; i--)
       {
           des[n++] = src[width*j + i];
       }
   }

   //copy u
   uint8 *ptemp = src + width * height;
   for(int j = hh - 1;j >= 0; j--)
   {
       for(int i = hw; i > 0; i--)
       {
           des[n++] = ptemp[hw * j + i];
       }
   }

   //copy v
   ptemp += width * height / 4;
   for(int j = hh - 1;j >= 0; j--)
   {
       for(int i = hw; i > 0; i--)
       {
           des[n++] = ptemp[hw * j + i];
       }
   }
}

void yuv_rotate_270(uint8* des,uint8* src,int width,int height)
{
   int n = 0;
   int hw = width / 2;
   int hh = height / 2;
   //copy y
   for(int j = width; j > 0; j--)
   {
       for(int i = 0; i < height;i++)
       {
           des[n++] = src[width*i + j];
       }
   }

   //copy u
   uint8 *ptemp = src + width * height;
   for(int j = hw; j > 0;j--)
   {
       for(int i = 0; i < hh;i++)
       {
           des[n++] = ptemp[hw * i + j];
       }
   }

   //copy v
   ptemp += width * height / 4;
   for(int j = hw; j > 0;j--)
   {
       for(int i = 0; i < hh;i++)
       {
           des[n++] = ptemp[hw * i + j];
       }
   }
}

/*
 * Class:     package_path/class_name
 * Method:    native_rotate
 * Signature: ([BI[BIIII)I
 */
JNIEXPORT jint JNICALL native_rotate
  (JNIEnv *env, jobject obj,
		  jbyteArray src,jbyteArray dst,jint src_width, jint src_height, jint mode)
  {
  	LOGI("native_rotate %d",mode);

	jbyte* src_data = env->GetByteArrayElements( src, JNI_FALSE);
	LOGD("rotate src_data[0-7]=%d %d %d %d %d %d %d %d",src_data[0],src_data[1],src_data[2],src_data[3],src_data[4],src_data[5],src_data[6],src_data[7]);

	int src_len = env->GetArrayLength(src);
	LOGI("src_len:%d",src_len);

  	jbyte *dst_data = env->GetByteArrayElements(dst, JNI_FALSE);
  	int dst_len = env->GetArrayLength(dst);
	LOGI("dst_len:%d",dst_len);
	memset(dst_data,0,dst_len);

	if(mode ==90){
		yuv_rotate_90((uint8 *)dst_data,(uint8 *)src_data,src_width,src_height);
	}else if(mode ==180){
		yuv_rotate_180((uint8 *)dst_data,(uint8 *)src_data,src_width,src_height);
	}else if(mode ==270){
		yuv_rotate_270((uint8 *)dst_data,(uint8 *)src_data,src_width,src_height);
	}else{
		LOGE("Not support degree!!!");
	}

	LOGD("rotate dst_data[0-7]=%d %d %d %d %d %d %d %d",dst_data[0],dst_data[1],dst_data[2],dst_data[3],dst_data[4],dst_data[5],dst_data[6],dst_data[7]);

	env->ReleaseByteArrayElements(src,src_data,0);
	env->ReleaseByteArrayElements(dst,dst_data,0);
	LOGI("native_rotate 2");

  	return 1;
 }


jboolean _initialize(JNIEnv* env, jobject thiz, jobject weak_thiz)
{
    return JNI_TRUE;
}

static JNINativeMethod gMethods[] = {
	{"native_rotate", "([B[BIII)I", (void*)native_rotate},
};

static int registerNativeMethods(JNIEnv* env
		, const char* className
		, JNINativeMethod* gMethods, int numMethods) {
	jclass clazz;
	clazz = env->FindClass(className);
	if (clazz == NULL) {
		return JNI_FALSE;
	}
	if (env->RegisterNatives(clazz, gMethods, numMethods) < 0) {
		return JNI_FALSE;
	}

	return JNI_TRUE;
}

static int registerNatives(JNIEnv* env) {
	const char* kClassName = "com/package_path/class_name";
	return registerNativeMethods(env, kClassName, gMethods,
			sizeof(gMethods) / sizeof(gMethods[0]));
}

JNIEXPORT jint JNICALL JNI_OnLoad(JavaVM* vm, void* reserved) {
	JNIEnv* env = NULL;
	jint result = -1;

	if (vm->GetEnv((void**) &env, JNI_VERSION_1_4) != JNI_OK) {
		return -1;
	}
	assert(env != NULL);

	if (!registerNatives(env)) {
		return -1;
	}

	result = JNI_VERSION_1_4;

	return result;
}


该算法为Y、U、V三个分量拷贝方式做旋转,可作为验证或演示两种用途,不能满足性能要求。yuv数据算法可参照安卓源码库中的external\libyuv以及开源库ffmpeg。
分享到:
评论

相关推荐

    YUV格式图片查看工具

    YUV格式图片查看工具是一种专为处理YUV(也称为YCbCr)图像格式而设计的应用程序。...使用这样的工具,用户可以方便地检查和分析YUV图像,这对于理解视频编码过程和优化多媒体内容的处理至关重要。

    yuv格式的视频帧旋转处理

    2. **块旋转**:将YUV图像划分为固定大小的块,对每个块进行旋转处理,然后重新排列。这种方法能减少计算量,但可能会引入块效应。 3. **重采样旋转**:通过插值或最近邻等方法,在新的旋转坐标系中进行重采样,以...

    YUV420格式图片 和 视频 测试用

    在开发过程中,YUV420格式的图片和视频可以用于测试编码和解码算法的正确性,评估不同编码参数对图像和视频质量的影响,以及优化硬件加速等。"jpgimage1_video_640_480.yuv"的低质量可能是为了测试在较差条件下编码...

    yuv图片查看器,免安装

    总之,"yuv图片查看器,免安装"是针对YUV格式图像设计的专业工具,它的出现简化了YUV图像的查看流程,对于处理这类图像的用户来说是一个高效且实用的解决方案。7yuv的特性使得它在IT行业中具有较高的实用价值,尤其...

    YUV图片查看器(Mac版)

    "YUV图片查看器(Mac版)"是一款针对Mac用户设计的专门用来查看YUV格式图像的软件。然而,值得注意的是,这款应用可能不支持最新的Mac操作系统版本。如果你的Mac已经更新到了较新的系统,可能无法正常使用该程序。...

    YUV格式查看器

    **YUV格式** YUV(YCbCr)是一种常见的视频和图像编码格式,主要用于数字视频处理和压缩。...此外,由于许多硬件编解码器直接支持YUV格式,因此了解和掌握如何处理YUV图像对于系统优化和性能提升也至关重要。

    yuv图像图片查看工具

    YUV图像图片查看工具是专为开发者设计的实用软件,它可以帮助用户便捷地查看和分析YUV格式的图像,对于图像开发、视频编码、解码以及质量测试等工作具有重要意义。 首先,我们要理解YUV是什么。YUV(也称为YCbCr)...

    YUV格式转换器

    - 开发者在进行视频处理(如裁剪、旋转、滤镜应用)时,也可能首选YUV格式,因为处理亮度比处理色度更快,降低了计算复杂度。 总之,YUV格式转换器是多媒体处理中不可或缺的工具,它帮助我们跨越不同视频格式的...

    yuv格式图片查看器

    压缩包内含1张测试用的320x240大小的...RawViewer1.0是一款用于查看播放yuv文件的播放器,支持查看播放及几何变换,可水平镜像、垂直镜像、图像转置、图像缩放与旋转等。 如果打不开图片,请在打开图片时配置图片参数。

    Android 使用libyuv对 yuv数据进行缩放,旋转,镜像,裁剪等操作

    总结来说,libyuv是Android开发者处理YUV图像数据的强大工具,通过其丰富的函数集,可以实现各种图像操作,提升应用的用户体验。通过深入理解和应用libyuv,可以构建出更高效、功能更丰富的多媒体应用。

    YUV转换显示编辑工具YUV420.YUV422

    3. 编辑YUV数据:可能包括裁剪、旋转、调整亮度、对比度等基本编辑功能,甚至可能有高级的色彩校正和滤波选项。 在视频处理和编码的上下文中,理解和熟练运用YUV转换工具对于优化视频质量和提高工作效率至关重要。...

    7yuv yuv图像查看工具

    - YUV图像的数据布局和字节顺序可能会因格式而异,因此在读取和写入文件时要确保正确处理。 - 由于YUV是无损格式,但显示设备通常使用RGB,所以在显示前可能需要进行色彩空间转换。 - 对于4:2:0等采样率的YUV图像,U...

    YUV图形翻转例子C语言编写

    同时,注意处理不同格式的YUV图像,如4:2:2或4:4:4,它们的采样策略会有所不同。 最后,`README`文件应包含详细说明,包括代码的使用方法、参数解释、可能的优化方案以及可能遇到的问题和解决方法。这将帮助其他...

    yuv查看工具,无需安装

    使用YUV查看工具时,用户可以预览YUV图像,检查像素级别的细节,验证编码或解码过程是否正确,或者对比不同处理方法对视频质量的影响。这些工具可能还具备一些高级功能,如快照、测量、色彩直方图分析,甚至支持基本...

    7yuv,yuv图片查看器

    4. 编辑和转换:除了查看,7yuv可能还具备简单的编辑功能,如裁剪、旋转或调整亮度、对比度等,同时也可能支持将YUV图像转换为其他常见的图像格式,如RGB的JPEG或PNG。 5. 分析工具:对于开发和调试,7yuv可能包含...

    yuv图像查看工具

    YUV图像查看工具是专为处理这种格式而设计的实用程序,它可以帮助用户查看、分析和处理通过摄像头捕获并保存的YUV图像。下面我们将详细探讨YUV图像格式、其工作原理以及与之相关的转换技术。 YUV全称为Y'CbCr,其中...

    NV21图像旋转、平移、缩放、画矩形的C++实现

    NV21是一种常见的YUV格式,被广泛用于Android设备。本文将深入探讨如何使用C++来实现NV21图像的旋转、平移、缩放以及画矩形的操作。 首先,我们需要了解NV21格式。NV21是一种YUV420sp(planar)格式,它由一个Y分量...

    YUYV图像浏览工具,可以直接打开YUYV图像

    工具的可用性证明了其界面友好,可能具有基本的图像操作功能,如缩放、平移、旋转以及亮度和对比度调整等。 在实际应用中,YUYV图像格式常出现在闭路电视(CCTV)系统、高清视频会议、无人机航拍等领域。例如,当你从...

    YUV420P转RGB32以及旋转处理

    本主题将深入探讨“YUV420P到RGB32”的转换过程,以及如何进行图像旋转,这对初学者理解YUV420P图像存储格式非常有帮助。 YUV420P是一种常见的颜色空间,广泛应用于视频编码和解码中,因为它比RGB颜色空间更节省...

    yuv_io.zip_python yuv read_python 保存YUV_python截取yuv_yuv python_读

    2. **处理YUV数据**:这个功能可能包括对YUV图像进行裁剪、缩放、旋转等操作。这些操作可以通过直接操作numpy数组完成。例如,裁剪YUV图像: ```python def crop_yuv(y, u, v, top, right, bottom, left): return...

Global site tag (gtag.js) - Google Analytics