提示:ARGB alpha通道的A + 原YUV表面的y0 + 要写进去的y1 = 计算出新的y2.

计算公式为 ( y1 * a + y0 * ( 255 - a ) ) / 255

void  rgb2yuv(int r, int g, int b, int *y, int *u, int *v)
{
int y0, u0, v0; y0 = 66*r + 129*g + 25*b;
u0 = -38*r + -74*g + 112*b;
v0 = 112*r + -94*g + -18*b; y0 = (y0+128)>>8;
u0 = (u0+128)>>8;
v0 = (v0+128)>>8; *y = y0 + 16;
*u = u0 + 128;
*v = v0 + 128;
} void yuv2rgb(int y, int u, int v, int *r, int *g, int *b)
{
int r0,g0,b0;
v = v - 128;
u = u - 128;
r0 = y + v + (v>>2) + (v>>3) + (v>>5);
g0 = y - ((u>>2) + (u>>4) + (u>>5)) - ((v>>1) + (v>>3) + (v>>4) + (v>>5));
b0 = y + u + (u>>1) + (u>>2) + (u>>6); *r = r0 > 255 ? 255: r0;
*g = g0 > 255 ? 255: g0;
*b = b0 > 255 ? 255: b0;
} int blitSurface2YUV(SDL_Surface *src, SDL_Overlay *dst, SDL_Rect *dstrect ,int isBlended)
{
Uint8 r, g, b,a;
int y0,u0,v0;
int y1,u1,v1;
int y2,u2,v2;
int y,x;
int height = src->h h ? src->h: dstrect->h;
int width = src->w w ? src->w: dstrect->w;
int uv_off = 0;
Uint32 pixel; printf ("src->format->BitsPerPixel %d src->format %08X\r\n",src->format->BitsPerPixel,src->format); if(dst->format != SDL_YV12_OVERLAY)return 1; for(y = 0; y format->BitsPerPixel)
{
case 8:
pixel = *((Uint8*)src->pixels + y*src->pitch + x);
break;
case 16:
pixel = *((Uint16*)src->pixels + y*src->pitch/2 + x);
break;
case 32:
pixel = *((Uint32*)src->pixels + y*src->pitch/4 + x); break;
default:
return -1;
} //SDL_GetRGB(pixel, src->format, &r, &g, &b);
SDL_GetRGBA(pixel, src->format, &r, &g, &b,&a); rgb2yuv(r, g, b, &y1, &u1, &v1); if(isBlended)
{
y0 = (dst->pixels[0][ (dstrect->y + y) * dst->pitches[0] + (dstrect->x + x)]);
v0 = (dst->pixels[1][ (uv_off + dstrect->y /2) * dst->pitches[1] + (dstrect->x/2 + x/2)]);
u0 = (dst->pixels[2][ (uv_off + dstrect->y /2) * dst->pitches[2] + (dstrect->x/2 + x/2)]); y2 = (Uint8)(( y1 * a + y0 * ( 255 - a ) ) / 255);
u2 = (Uint8)(( u1 * a + u0 * ( 255 - a ) ) / 255);
v2 = (Uint8)(( v1 * a + v0 * ( 255 - a ) ) / 255); y1=y2;
u1=u2;
v1=v2;
} memset(dst->pixels[0] + (dstrect->y + y) * dst->pitches[0] + (dstrect->x + x),
(Uint8)y1 , 1); if((x%2 == 0 ) && (y%2 == 0 ))
{
memset(dst->pixels[1] + (uv_off + dstrect->y /2) * dst->pitches[1] + (dstrect->x/2 + x/2),
(Uint8)v1, 1);
memset(dst->pixels[2] + (uv_off + dstrect->y /2) * dst->pitches[2] + (dstrect->x/2 + x/2),
(Uint8)u1, 1);
}
}
if(y%2 == 0)++uv_off;
}
return 0;
}

ARGB32 to YUV12 利用 SDL1.2 SDL_ttf 在视频表面输出文本的更多相关文章

  1. 【Linux】利用Xvfb关闭chrome的图形化输出

    利用Xvfb关闭chrome的图形化输出 #!/bin/bash . /home/fzuir/.profile # JAVA export JAVA_HOME=/usr/local/jdk1.7.0_ ...

  2. Java 利用缓冲字节流来实现视频、音频、图片的复制粘贴

    InputStream:继承自InputStream的流都是用于向程序中输入数据的,且数据单位都是字节(8位). OutputSteam:继承自OutputStream的流都是程序用于向外输出数据的, ...

  3. 利用FFmpeg玩转Android视频录制与压缩(二)<转>

    转载出处:http://blog.csdn.net/mabeijianxi/article/details/72983362 预热 时光荏苒,光阴如梭,离上一次吹牛逼已经过去了两三个月,身边很多人的女 ...

  4. 利用java从docx文档中提取文本内容

    利用java从docx文档中提取文本内容 使用Apache的第三方jar包,地址为https://poi.apache.org/ docx文档内容如图: 目录结构: 每个文件夹的名称为日期加上来源,例 ...

  5. 利用开源jPlayer播放.flv视频文件

    最近工作中用到视频播放,在网上搜索对比了好几款开源播放插件后,觉得 jPlayer 是比较不错的,故作此记录! 接下来先快速的展示一下 利用jPlayer播放.flv视频的效果: <!DOCTY ...

  6. java利用过滤器实现编码的转换,内容输出的替换

    在页面建个表单 <form action="login.do" method="post"> <input type="text&q ...

  7. Unity3D基础学习 利用NGUI的Texture播放视频

    利用NGUI播放视频,首先你得导入你的视频 你的电脑中必须安装QuickTime软件,没有,去下一个,如果是Windows系统,安装完之后重启. 接下来转换你的视频格式,如果你的视频在QuickTim ...

  8. 利用jieba,word2vec,LR进行搜狐新闻文本分类

    一.简介 1)jieba 中文叫做结巴,是一款中文分词工具,https://github.com/fxsjy/jieba 2)word2vec 单词向量化工具,https://radimrehurek ...

  9. 利用循环播放dataurl的视频来防止锁屏:NoSleep.js

    mark下. 地址:http://www.open-open.com/lib/view/open1430796889882.html

随机推荐

  1. Lucene 4.7 --高亮显示

    jar lucene-analyzers-common-4.7.0.jar lucene-analyzers-smartcn-4.7.0.jar lucene-core-4.7.0.jar lucen ...

  2. fedora安装软件

    jdk 1.下载rpm包 注意32位还是64位,注意是rpm格式 2.安装 sudo rpm -ivh jdk.rpm sudo update-alternatives --config java # ...

  3. vim YouCompleteMe

    http://www.ithao123.cn/content-1906969.html http://www.it165.net/os/html/201503/12190.html

  4. poj1787Charlie's Change(多重背包+记录路径+好题)

    Charlie's Change Time Limit: 1000MS   Memory Limit: 30000K Total Submissions: 3720   Accepted: 1125 ...

  5. Nagios配置和命令介绍(二 )

    Nagios配置 Nagios 主要用于监控一台或者多台本地主机及远程的各种信息,包括本机资源及对外的服务等.默认的Nagios 配置没有任何监控内容,仅是一些模板文件.若要让Nagios 提供服务, ...

  6. leach协议matlab仿真代码

    http://www.ilovematlab.cn/thread-177006-1-1.html LEACH協議clear;%清除內存變量 xm=100;%x軸範圍ym=100;%y軸範圍 sink. ...

  7. 周期串(Periodic Strings,UVa455)

    解题思路: 对一个字符串求其最小周期长度,那么,最小周期长度必定是字符串长度的约数,即最小周期长度必定能被字符串长度整除 其次,对于最小周期字符串,每位都能对应其后周期字串的每一位, 即 ABC  A ...

  8. ios 清理缓存

    //拿到要清理的路径,其实就是caches的路径,一般像这种很多地方都会用到的地方真好搞成宏,不过现在苹果不提倡用宏了 //在swift中可以定义成全局的常量 //遍历caches,将内部的文件大小计 ...

  9. WEB移动应用框架构想(转载)

    iUI.jQTouch.WPTouch.PhoneGap.XUI.iWebkit.Rhodes.gwt-mobile…当我们已经开始惊 叹 web移动应用充斥着各种各样框架与类库的时候,其实各大web ...

  10. SQL Server中的联合主键、聚集索引、非聚集索引、mysql 联合索引

    我们都知道在一个表中当需要2列以上才能确定记录的唯一性的时候,就需要用到联合主键,当建立联合主键以后,在查询数据的时候性能就会有很大的提升,不过并不是对联合主键的任何列单独查询的时候性能都会提升,但我 ...