FBI 叠加自定义中文字库 做OSD用,或者叠加其他信息
2 E币
成为会员,免费下载资料
文件大小:991.6 KB
上传者:ngswfx
时间:2016-06-22 19:02:29
下载量:250
本帖最后由 ngswfx 于 2016-6-22 19:07 编辑
[quote][url=forum.php?mod=redirect&goto=findpost&pid=32200&ptid=11624]ngswfx 发表于 2016-6-22 18:59[/url]
不错,有点意思了[/quote]
///////////关键部分代码 附件中有字库,不过字库就大一些了,不知道打包到文件会压缩成怎样。
//下面的代码我没试过,可能需要自己根据字库修改。下面的代码肯定不是1555的,应该是YUV 中针对Y这部分
//32*32 hzk
unsigned long __stdcall ShowOSD32Ex(unsigned char *pBase, char *pStr, unsigned short x, unsigned short y, unsigned short space, unsigned char Lum, int width, int height, int stride)
{
Int8 q=3, w, asc=0,*p=(Int8 *)pStr;
UInt8 *pHZLib=0;
UInt32 nChar=0,wd=0,nOffset=0,nSize, l, r;
float fsize = 0,fwd = 0;
Int8 *pp = p, num=0;
x = UCLIPI(x, width-48);
y = UCLIPI(y, height-24);
pBase += stride*y*2+x*2;
while (*p) {
pp = p;
q = *p&0x80?(*p++)-161:2; // Get qu code
w=((*p++)&0x7f)-33; // Get wei code
if ((nOffset = q*94+w) >= g_real_HZ16_count)
continue;
//32*32
pHZLib = (HZ32Lib+(nOffset<<7));
if (q<10) {
l = UBYTESEL(HZ16_Space[nOffset],1)*2;
r = UBYTESEL(HZ16_Space[nOffset],0)*2;
nSize = HZ32LIB_ZISE-(l+r);//+space;
fsize = 20.2;
}
else {
nSize = HZ32LIB_ZISE+space;
l = r = 0;
fsize = 40.4;
}
if (x+(int)fwd+(int)fsize+2>width)
break;
// Draw here
DrawOSD32(pBase+wd+nChar*(16-r-l), (unsigned int *)pHZLib,Lum,64,stride);
nChar++;
wd += nSize;
fwd += fsize;
}
return nChar;
}
void DrawOSD32(unsigned char *buf, unsigned int *hzLib, char lum, char bklum, int stride)
{
static unsigned char fontlum[] = {64,192};
int i, font;
int lumi,chroma_u,chroma_v;
int *p1 = (int *) buf+(stride<<4);
float mult_f = lum?0.20:1;
float mult_b = 1 - mult_f;
int avglum = (buf[0] + buf[2] + buf[4] + buf[6] + buf[8] +
buf[10] + buf[12] + buf[14] + buf[16] + buf[18] + buf[20] +
buf[22] + buf[24] + buf[26] + buf[28] + buf[30] +buf[32] +
buf[34] + buf[36] + buf[38] + buf[40] + buf[42] +buf[44] +
buf[46] + buf[48] + buf[50] +buf[52] +buf[54] +buf[56] +
buf[58] + buf[60] +buf[62])/32;
if(avglum>135)
lumi = 0x1;
else
lumi = 0xff;
//lumi = 0xff;
chroma_u = 0x80;
chroma_v = 0x80;
for (i=0; i<32; i++) {
font = *hzLib ++;
/*
buf[0] = MUX(font&0x0080, lumi, buf[0] );
buf[2] = MUX(font&0x0040, lumi, buf[2] );
buf[4] = MUX(font&0x0020, lumi, buf[4] );
buf[6] = MUX(font&0x0010, lumi, buf[6] );
buf[8] = MUX(font&0x0008, lumi, buf[8] );
buf[10] = MUX(font&0x0004, lumi,buf[10]);
buf[12] = MUX(font&0x0002, lumi,buf[12]);
buf[14] = MUX(font&0x0001, lumi,buf[14]);
buf[16] = MUX(font&0x8000, lumi,buf[16]);
buf[18] = MUX(font&0x4000, lumi,buf[18]);
buf[20] = MUX(font&0x2000, lumi, buf[20]);
buf[22] = MUX(font&0x1000, lumi, buf[22]);
buf[24] = MUX(font&0x0800, lumi, buf[24]);
buf[26] = MUX(font&0x0400, lumi, buf[26]);
buf[28] = MUX(font&0x0200, lumi, buf[28]);
buf[30] = MUX(font&0x0100, lumi, buf[30]);
*/
buf[0] = (unsigned char)(MUX(font&0x0080, lumi*mult_f+buf[0]*mult_b, buf[0] ));
buf[2] = (unsigned char)(MUX(font&0x0040, lumi*mult_f+buf[2]*mult_b, buf[2] ));
buf[4] = (unsigned char)(MUX(font&0x0020, lumi*mult_f+buf[4]*mult_b, buf[4] ));
buf[6] = (unsigned char)(MUX(font&0x0010, lumi*mult_f+buf[6]*mult_b, buf[6] ));
buf[8] = (unsigned char)(MUX(font&0x0008, lumi*mult_f+buf[8]*mult_b, buf[8] ));
buf[10] = (unsigned char)(MUX(font&0x0004, lumi*mult_f+buf[10]*mult_b,buf[10]));
buf[12] = (unsigned char)(MUX(font&0x0002, lumi*mult_f+buf[12]*mult_b,buf[12]));
buf[14] = (unsigned char)(MUX(font&0x0001, lumi*mult_f+buf[14]*mult_b,buf[14]));
buf[16] = (unsigned char)(MUX(font&0x8000, lumi*mult_f+buf[16]*mult_b,buf[16]));
buf[18] = (unsigned char)(MUX(font&0x4000, lumi*mult_f+buf[18]*mult_b,buf[18]));
buf[20] = (unsigned char)(MUX(font&0x2000, lumi*mult_f+buf[20]*mult_b, buf[20]));
buf[22] = (unsigned char)(MUX(font&0x1000, lumi*mult_f+buf[22]*mult_b, buf[22]));
buf[24] = (unsigned char)(MUX(font&0x0800, lumi*mult_f+buf[24]*mult_b, buf[24]));
buf[26] = (unsigned char)(MUX(font&0x0400, lumi*mult_f+buf[26]*mult_b, buf[26]));
buf[28] = (unsigned char)(MUX(font&0x0200, lumi*mult_f+buf[28]*mult_b, buf[28]));
buf[30] = (unsigned char)(MUX(font&0x0100, lumi*mult_f+buf[30]*mult_b, buf[30]));
buf[32] = (unsigned char)(MUX(font&0x800000,lumi*mult_f+buf[32]*mult_b,buf[32]));
buf[34] = (unsigned char)(MUX(font&0x400000,lumi*mult_f+buf[34]*mult_b, buf[34]));
buf[36] = (unsigned char)(MUX(font&0x200000, lumi*mult_f+buf[36]*mult_b, buf[36] ));
buf[38] = (unsigned char)(MUX(font&0x100000, lumi*mult_f+buf[38]*mult_b, buf[38] ));
buf[40] = (unsigned char)(MUX(font&0x080000, lumi*mult_f+buf[40]*mult_b, buf[40] ));
buf[42] = (unsigned char)(MUX(font&0x040000, lumi*mult_f+buf[42]*mult_b,buf[42]));
buf[44] = (unsigned char)(MUX(font&0x020000, lumi*mult_f+buf[44]*mult_b,buf[44]));
buf[46] = (unsigned char)(MUX(font&0x010000, lumi*mult_f+buf[46]*mult_b,buf[46]));
buf[48] = (unsigned char)(MUX(font&0x80000000, lumi*mult_f+buf[48]*mult_b,buf[48]));
buf[50] = (unsigned char)(MUX(font&0x40000000, lumi*mult_f+buf[50]*mult_b,buf[50]));
buf[52] = (unsigned char)(MUX(font&0x20000000, lumi*mult_f+buf[52]*mult_b,buf[52]));
buf[54] = (unsigned char)(MUX(font&0x10000000, lumi*mult_f+buf[54]*mult_b,buf[54]));
buf[56] = (unsigned char)(MUX(font&0x08000000, lumi*mult_f+buf[56]*mult_b,buf[56]));
buf[58] = (unsigned char)(MUX(font&0x04000000, lumi*mult_f+buf[58]*mult_b,buf[58]));
buf[60] = (unsigned char)(MUX(font&0x02000000, lumi*mult_f+buf[60]*mult_b,buf[60]));
buf[62] = (unsigned char)(MUX(font&0x01000000, lumi*mult_f+buf[62]*mult_b,buf[62]));
buf[1] = (unsigned char)(MUX(font&0x0080, chroma_u, buf[1] ));
buf[3] = (unsigned char)(MUX(font&0x0040, chroma_v, buf[3] ));
buf[5] = (unsigned char)(MUX(font&0x0020, chroma_u, buf[5] ));
buf[7] = (unsigned char)(MUX(font&0x0010, chroma_v, buf[7] ));
buf[9] = (unsigned char)(MUX(font&0x0008, chroma_u, buf[9] ));
buf[11] = (unsigned char)(MUX(font&0x0004, chroma_v,buf[11]));
buf[13] = (unsigned char)(MUX(font&0x0002, chroma_u,buf[13]));
buf[15] = (unsigned char)(MUX(font&0x0001, chroma_v,buf[15]));
buf[17] = (unsigned char)(MUX(font&0x8000, chroma_u,buf[17]));
buf[19] = (unsigned char)(MUX(font&0x4000, chroma_v,buf[19]));
buf[21] = (unsigned char)(MUX(font&0x2000, chroma_u, buf[21]));
buf[23] = (unsigned char)(MUX(font&0x1000, chroma_v, buf[23]));
buf[25] = (unsigned char)(MUX(font&0x0800, chroma_u, buf[25]));
buf[27] = (unsigned char)(MUX(font&0x0400, chroma_v, buf[27]));
buf[29] = (unsigned char)(MUX(font&0x0200, chroma_u, buf[29]));
buf[31] = (unsigned char)(MUX(font&0x0100, chroma_v, buf[31]));
buf[33] = (unsigned char)(MUX(font&0x800000, chroma_u, buf[33] ));
buf[35] = (unsigned char)(MUX(font&0x400000, chroma_v, buf[35] ));
buf[37] = (unsigned char)(MUX(font&0x200000, chroma_u, buf[37] ));
buf[39] = (unsigned char)(MUX(font&0x100000, chroma_v, buf[39] ));
buf[41] = (unsigned char)(MUX(font&0x080000, chroma_u, buf[41] ));
buf[43] = (unsigned char)(MUX(font&0x040000, chroma_v,buf[43]));
buf[45] = (unsigned char)(MUX(font&0x020000, chroma_u,buf[45]));
buf[47] = (unsigned char)(MUX(font&0x010000, chroma_v,buf[47]));
buf[49] = (unsigned char)(MUX(font&0x80000000, chroma_u,buf[49]));
buf[51] = (unsigned char)(MUX(font&0x40000000, chroma_v,buf[51]));
buf[53] = (unsigned char)(MUX(font&0x20000000, chroma_u, buf[53]));
buf[55] = (unsigned char)(MUX(font&0x10000000, chroma_v, buf[55]));
buf[57] = (unsigned char)(MUX(font&0x08000000, chroma_u, buf[57]));
buf[59] = (unsigned char)(MUX(font&0x04000000, chroma_v, buf[59]));
buf[61] = (unsigned char)(MUX(font&0x02000000, chroma_u, buf[61]));
buf[63] = (unsigned char)(MUX(font&0x01000000, chroma_v, buf[63]));
buf += stride*2;
}
}
[quote][url=forum.php?mod=redirect&goto=findpost&pid=32200&ptid=11624]ngswfx 发表于 2016-6-22 18:59[/url]
不错,有点意思了[/quote]
///////////关键部分代码 附件中有字库,不过字库就大一些了,不知道打包到文件会压缩成怎样。
//下面的代码我没试过,可能需要自己根据字库修改。下面的代码肯定不是1555的,应该是YUV 中针对Y这部分
//32*32 hzk
unsigned long __stdcall ShowOSD32Ex(unsigned char *pBase, char *pStr, unsigned short x, unsigned short y, unsigned short space, unsigned char Lum, int width, int height, int stride)
{
Int8 q=3, w, asc=0,*p=(Int8 *)pStr;
UInt8 *pHZLib=0;
UInt32 nChar=0,wd=0,nOffset=0,nSize, l, r;
float fsize = 0,fwd = 0;
Int8 *pp = p, num=0;
x = UCLIPI(x, width-48);
y = UCLIPI(y, height-24);
pBase += stride*y*2+x*2;
while (*p) {
pp = p;
q = *p&0x80?(*p++)-161:2; // Get qu code
w=((*p++)&0x7f)-33; // Get wei code
if ((nOffset = q*94+w) >= g_real_HZ16_count)
continue;
//32*32
pHZLib = (HZ32Lib+(nOffset<<7));
if (q<10) {
l = UBYTESEL(HZ16_Space[nOffset],1)*2;
r = UBYTESEL(HZ16_Space[nOffset],0)*2;
nSize = HZ32LIB_ZISE-(l+r);//+space;
fsize = 20.2;
}
else {
nSize = HZ32LIB_ZISE+space;
l = r = 0;
fsize = 40.4;
}
if (x+(int)fwd+(int)fsize+2>width)
break;
// Draw here
DrawOSD32(pBase+wd+nChar*(16-r-l), (unsigned int *)pHZLib,Lum,64,stride);
nChar++;
wd += nSize;
fwd += fsize;
}
return nChar;
}
void DrawOSD32(unsigned char *buf, unsigned int *hzLib, char lum, char bklum, int stride)
{
static unsigned char fontlum[] = {64,192};
int i, font;
int lumi,chroma_u,chroma_v;
int *p1 = (int *) buf+(stride<<4);
float mult_f = lum?0.20:1;
float mult_b = 1 - mult_f;
int avglum = (buf[0] + buf[2] + buf[4] + buf[6] + buf[8] +
buf[10] + buf[12] + buf[14] + buf[16] + buf[18] + buf[20] +
buf[22] + buf[24] + buf[26] + buf[28] + buf[30] +buf[32] +
buf[34] + buf[36] + buf[38] + buf[40] + buf[42] +buf[44] +
buf[46] + buf[48] + buf[50] +buf[52] +buf[54] +buf[56] +
buf[58] + buf[60] +buf[62])/32;
if(avglum>135)
lumi = 0x1;
else
lumi = 0xff;
//lumi = 0xff;
chroma_u = 0x80;
chroma_v = 0x80;
for (i=0; i<32; i++) {
font = *hzLib ++;
/*
buf[0] = MUX(font&0x0080, lumi, buf[0] );
buf[2] = MUX(font&0x0040, lumi, buf[2] );
buf[4] = MUX(font&0x0020, lumi, buf[4] );
buf[6] = MUX(font&0x0010, lumi, buf[6] );
buf[8] = MUX(font&0x0008, lumi, buf[8] );
buf[10] = MUX(font&0x0004, lumi,buf[10]);
buf[12] = MUX(font&0x0002, lumi,buf[12]);
buf[14] = MUX(font&0x0001, lumi,buf[14]);
buf[16] = MUX(font&0x8000, lumi,buf[16]);
buf[18] = MUX(font&0x4000, lumi,buf[18]);
buf[20] = MUX(font&0x2000, lumi, buf[20]);
buf[22] = MUX(font&0x1000, lumi, buf[22]);
buf[24] = MUX(font&0x0800, lumi, buf[24]);
buf[26] = MUX(font&0x0400, lumi, buf[26]);
buf[28] = MUX(font&0x0200, lumi, buf[28]);
buf[30] = MUX(font&0x0100, lumi, buf[30]);
*/
buf[0] = (unsigned char)(MUX(font&0x0080, lumi*mult_f+buf[0]*mult_b, buf[0] ));
buf[2] = (unsigned char)(MUX(font&0x0040, lumi*mult_f+buf[2]*mult_b, buf[2] ));
buf[4] = (unsigned char)(MUX(font&0x0020, lumi*mult_f+buf[4]*mult_b, buf[4] ));
buf[6] = (unsigned char)(MUX(font&0x0010, lumi*mult_f+buf[6]*mult_b, buf[6] ));
buf[8] = (unsigned char)(MUX(font&0x0008, lumi*mult_f+buf[8]*mult_b, buf[8] ));
buf[10] = (unsigned char)(MUX(font&0x0004, lumi*mult_f+buf[10]*mult_b,buf[10]));
buf[12] = (unsigned char)(MUX(font&0x0002, lumi*mult_f+buf[12]*mult_b,buf[12]));
buf[14] = (unsigned char)(MUX(font&0x0001, lumi*mult_f+buf[14]*mult_b,buf[14]));
buf[16] = (unsigned char)(MUX(font&0x8000, lumi*mult_f+buf[16]*mult_b,buf[16]));
buf[18] = (unsigned char)(MUX(font&0x4000, lumi*mult_f+buf[18]*mult_b,buf[18]));
buf[20] = (unsigned char)(MUX(font&0x2000, lumi*mult_f+buf[20]*mult_b, buf[20]));
buf[22] = (unsigned char)(MUX(font&0x1000, lumi*mult_f+buf[22]*mult_b, buf[22]));
buf[24] = (unsigned char)(MUX(font&0x0800, lumi*mult_f+buf[24]*mult_b, buf[24]));
buf[26] = (unsigned char)(MUX(font&0x0400, lumi*mult_f+buf[26]*mult_b, buf[26]));
buf[28] = (unsigned char)(MUX(font&0x0200, lumi*mult_f+buf[28]*mult_b, buf[28]));
buf[30] = (unsigned char)(MUX(font&0x0100, lumi*mult_f+buf[30]*mult_b, buf[30]));
buf[32] = (unsigned char)(MUX(font&0x800000,lumi*mult_f+buf[32]*mult_b,buf[32]));
buf[34] = (unsigned char)(MUX(font&0x400000,lumi*mult_f+buf[34]*mult_b, buf[34]));
buf[36] = (unsigned char)(MUX(font&0x200000, lumi*mult_f+buf[36]*mult_b, buf[36] ));
buf[38] = (unsigned char)(MUX(font&0x100000, lumi*mult_f+buf[38]*mult_b, buf[38] ));
buf[40] = (unsigned char)(MUX(font&0x080000, lumi*mult_f+buf[40]*mult_b, buf[40] ));
buf[42] = (unsigned char)(MUX(font&0x040000, lumi*mult_f+buf[42]*mult_b,buf[42]));
buf[44] = (unsigned char)(MUX(font&0x020000, lumi*mult_f+buf[44]*mult_b,buf[44]));
buf[46] = (unsigned char)(MUX(font&0x010000, lumi*mult_f+buf[46]*mult_b,buf[46]));
buf[48] = (unsigned char)(MUX(font&0x80000000, lumi*mult_f+buf[48]*mult_b,buf[48]));
buf[50] = (unsigned char)(MUX(font&0x40000000, lumi*mult_f+buf[50]*mult_b,buf[50]));
buf[52] = (unsigned char)(MUX(font&0x20000000, lumi*mult_f+buf[52]*mult_b,buf[52]));
buf[54] = (unsigned char)(MUX(font&0x10000000, lumi*mult_f+buf[54]*mult_b,buf[54]));
buf[56] = (unsigned char)(MUX(font&0x08000000, lumi*mult_f+buf[56]*mult_b,buf[56]));
buf[58] = (unsigned char)(MUX(font&0x04000000, lumi*mult_f+buf[58]*mult_b,buf[58]));
buf[60] = (unsigned char)(MUX(font&0x02000000, lumi*mult_f+buf[60]*mult_b,buf[60]));
buf[62] = (unsigned char)(MUX(font&0x01000000, lumi*mult_f+buf[62]*mult_b,buf[62]));
buf[1] = (unsigned char)(MUX(font&0x0080, chroma_u, buf[1] ));
buf[3] = (unsigned char)(MUX(font&0x0040, chroma_v, buf[3] ));
buf[5] = (unsigned char)(MUX(font&0x0020, chroma_u, buf[5] ));
buf[7] = (unsigned char)(MUX(font&0x0010, chroma_v, buf[7] ));
buf[9] = (unsigned char)(MUX(font&0x0008, chroma_u, buf[9] ));
buf[11] = (unsigned char)(MUX(font&0x0004, chroma_v,buf[11]));
buf[13] = (unsigned char)(MUX(font&0x0002, chroma_u,buf[13]));
buf[15] = (unsigned char)(MUX(font&0x0001, chroma_v,buf[15]));
buf[17] = (unsigned char)(MUX(font&0x8000, chroma_u,buf[17]));
buf[19] = (unsigned char)(MUX(font&0x4000, chroma_v,buf[19]));
buf[21] = (unsigned char)(MUX(font&0x2000, chroma_u, buf[21]));
buf[23] = (unsigned char)(MUX(font&0x1000, chroma_v, buf[23]));
buf[25] = (unsigned char)(MUX(font&0x0800, chroma_u, buf[25]));
buf[27] = (unsigned char)(MUX(font&0x0400, chroma_v, buf[27]));
buf[29] = (unsigned char)(MUX(font&0x0200, chroma_u, buf[29]));
buf[31] = (unsigned char)(MUX(font&0x0100, chroma_v, buf[31]));
buf[33] = (unsigned char)(MUX(font&0x800000, chroma_u, buf[33] ));
buf[35] = (unsigned char)(MUX(font&0x400000, chroma_v, buf[35] ));
buf[37] = (unsigned char)(MUX(font&0x200000, chroma_u, buf[37] ));
buf[39] = (unsigned char)(MUX(font&0x100000, chroma_v, buf[39] ));
buf[41] = (unsigned char)(MUX(font&0x080000, chroma_u, buf[41] ));
buf[43] = (unsigned char)(MUX(font&0x040000, chroma_v,buf[43]));
buf[45] = (unsigned char)(MUX(font&0x020000, chroma_u,buf[45]));
buf[47] = (unsigned char)(MUX(font&0x010000, chroma_v,buf[47]));
buf[49] = (unsigned char)(MUX(font&0x80000000, chroma_u,buf[49]));
buf[51] = (unsigned char)(MUX(font&0x40000000, chroma_v,buf[51]));
buf[53] = (unsigned char)(MUX(font&0x20000000, chroma_u, buf[53]));
buf[55] = (unsigned char)(MUX(font&0x10000000, chroma_v, buf[55]));
buf[57] = (unsigned char)(MUX(font&0x08000000, chroma_u, buf[57]));
buf[59] = (unsigned char)(MUX(font&0x04000000, chroma_v, buf[59]));
buf[61] = (unsigned char)(MUX(font&0x02000000, chroma_u, buf[61]));
buf[63] = (unsigned char)(MUX(font&0x01000000, chroma_v, buf[63]));
buf += stride*2;
}
}
展开》
折叠》