int LoadYUVFromBmpFile(char *FileName, unsigned char *yuv, int BufLen, int *Width, int *Height);
参数: char *FileName 文件名
unsigned char *yuv YUV422格式的图像指针
int BufLen yuv缓存大小
int *Width 返回yuv图像的宽度
int *Height 返回yuv图像的高度
说明:把24位bmp 文件转成yuv格式的数据;
返回:正确为0, 其他为第1节定义的错误号;
SDK中的例子代码如下:
if(dlg.m_logoEnable){
int w,h;
unsigned char *bitsBuffer = (unsigned char *)malloc(128 * 128 * 2);
if(bitsBuffer == NULL)
return;
LoadYUVFromBmpFile("logo.bmp", bitsBuffer, 128 * 128 * 2, &w, &h);
for( i = 0; i < GetTotalDSPs(); i++){
SetLogoDisplayMode(ChannelHandle[i], RGB(0,0,0),TRUE, 0);
SetLogo(ChannelHandle[i], 0, 0, 128, 128, (UCHAR *)bitsBuffer);
}
free(bitsBuffer);
}else{
for( i = 0; i < GetTotalDSPs(); i++){
StopLogo(ChannelHandle[i]);
}
}
__________________________________________________________________________________________________________________
另外还有如下函数:
SetOsdDisplayMode(HANDLE hChannelHandle, int Brightness, BOOL Translucent, int TwinkleInterval, USHORT *Format1, USHORT *Format2)
参数:HANDLE hChannelHandle 通道句柄
int Brightness OSD显示亮度,255最亮,0最暗;
BOOL Translucent OSD图象是否做半透明处理;
Int TwinkleInterval (V3.2改动为:当值为1时,OSD的亮度根据背景的亮度来调整,但背景较亮时,OSD亮度自动调低,但背景较暗时,OSD亮度自动调亮。原来的闪烁功能关闭)3.2版本之前请参考4.41节描述。
USHORT *Forma1,* Format2 描述字符叠加的位置和次序的格式
串,具体定义如下:
USHORT X, USHORT Y, CHAR0, CHAR1, CHAR2,… CHARN, NULL
其中X,Y 是该字串在标准CIF图象的起始位置,X必须是8的倍数,Y可以在图象高度内取值即(0-287)PAL 、(0-239)NTSC;CHARN也是USHORT型的参数,可以是ASCII码也可以是汉字,当想要显示当前时间时,可以指定为固定的时间定义值,其值如下:
_OSD_YEAR4 四位的年显示,如2002
_OSD_YEAR2 两位的年显示,如02
_OSD_MONTH3 英文的月显示,如 Jan
_OSD_MONTH2 两位阿拉伯数字的月显示,如07
_OSD_DAY 两位的阿拉伯数字的日显示,如31
_OSD_WEEK3 英文的星期显示,如Tue
_OSD_CWEEK1 中文的星期显示,如星期二
_OSD_HOUR24 24小时的时钟显示,如18
_OSD_HOUR12 12小时的时钟显示,如AM09或PM09
_OSD_MINUTE 两位分钟的显示
_OSD_SECOND 两位秒的显示
在格式字符串的最后必须以NULL(0)结尾,否则会显示错误的内容。
字符串和时间显示可以在FORMAT1 也可以在FORAMT2,也可以混合在一起,但不得超过一行CIF 图象的宽度。
要显示位置在16,19的字符串“办公室”的格式字符串如下:
USHORT Format[] = {16, 19, ‘办’,’公’,’室’, ‘\0’};
要显示位置在8, 3的时间字符串可以如下:
USHORT Format[]={8, 3, _OSD_YEAR4, ‘年’,_OSD_MONTH2,’月’,_OSD_DAY, ‘日’,_OSD_HOUR24,’:’, _OSD_MINUTE, ‘:’, _OSD_SECOND, ‘\0’};
如果只想显示其中一行,则将起始的字符串定义如下:
USHORT FormatNoDisplay[]={0, 0, ‘\0’};
对于SetOsdDisplayMode这个函数,我已经可以正确的声明及调用了,相应的代码如下:
'叠加OSD字幕信息
Dim Format1() As UShort = {96, 30, _OSD_YEAR4, Asc("-"), _OSD_MONTH2, Asc("-"), _OSD_DAY, Asc("-"), _OSD_HOUR24, Asc(":"), _OSD_MINUTE, Asc(":"), _OSD_SECOND, 0}
Dim Format2() As UShort = {96, 45, Asc("C"), Asc("H"), Asc(":"), Asc("1"), 0}
SetOsdDisplayMode(_ChHandle, 255, True, 1, Format1, Format2)
但是无法实现显示中文字符串的功能,不知道该如何才能显示出中文的OSD中文信息(例如:2008年2月12日)。
对于LoadYUVFromBmpFile这个函数,则不能正确的调用,函数返回值总是错误的(不等于0)。相应的声明及代码如下:
<DllImport("DS40xxSDK.dll", EntryPoint:="LoadYUVFromBmpFile", CharSet:=CharSet.Auto, SetLastError:=True, ExactSpelling:=True, CallingConvention:=CallingConvention.StdCall)> Public Function LoadYUVFromBmpFile(ByRef FileName As String, ByRef yuv As Byte, ByVal BufLen As Integer, ByRef Width As Integer, ByRef Height As Integer) As Integer
End Function
Dim w,h as Integer
dim yuv as byte
LoadYUVFormBmpFile("logo.bmp",yuv,128*128*2,w,h) ====>这里函数的返回值不正确。
小弟对C不熟悉,请教各位大侠应该如何在vb.net中声明及调用上述函数?
18 个解决方案
#1
我用VB2005写了一个,你参考一下吧。
Public Declare Ansi Function LoadYUVFromBmpFile Lib "动态库名称.dll" (ByVal FileName As String, ByVal yuv As Byte(), ByVal BufLen As Integer, ByRef Width As Integer, ByRef Height As Integer) As Integer
Public Declare Ansi Sub SetOsdDisplayMode Lib "动态库名称.dll" (ByVal hChannelHandle As UInteger, ByVal Brightness As Integer, ByVal Translucent As Boolean, ByVal TwinkleInterval As Integer, ByVal Format1 As UInt16(), ByVal Format2 As UInt16())
#2
看一下头文件是在哪个文件里引入那个文件.
你查一下.在.NET DRAWN命令空间有没有这样类似的函数.
应该是有的..
你查一下.在.NET DRAWN命令空间有没有这样类似的函数.
应该是有的..
#3
cnzdgs(回贴亦是善举):
我按照你的声明试过了,还是不行啊。
对于LoadYUVFromBmpFile,按照你的方法:
Public Declare Ansi Function LoadYUVFromBmpFile Lib "动态库名称.dll" (ByVal FileName As String, ByVal yuv As Byte(), ByVal BufLen As Integer, ByRef Width As Integer, ByRef Height As Integer) As Integer
然后在代码中如此调用:
'叠加Logo信息
Dim width As Integer
Dim length As Integer
Dim yuv(32768) As Byte
Dim SDKResult as integer=LoadYUVFromBmpFile("E:\logo.bmp", yuv, 32768, width, length) <<-----在这里弹出异常。
异常信息如下:
未处理AccessVoilationException
尝试读取或写入受保护的内存。这通常指示其他内存已损坏。
这是我在SDK中的找到的例子代码:
int w,h;
unsigned char *bitsBuffer = (unsigned char *)malloc(128 * 128 * 2);
LoadYUVFromBmpFile("logo.bmp", bitsBuffer, 128 * 128 * 2, &w, &h);
对于C我不懂,所以麻烦大家帮我看一下,上述的C代码如何用VB.net实现呢?
分不够可以再加,拜托各位帮帮小弟,先谢过了。
我按照你的声明试过了,还是不行啊。
对于LoadYUVFromBmpFile,按照你的方法:
Public Declare Ansi Function LoadYUVFromBmpFile Lib "动态库名称.dll" (ByVal FileName As String, ByVal yuv As Byte(), ByVal BufLen As Integer, ByRef Width As Integer, ByRef Height As Integer) As Integer
然后在代码中如此调用:
'叠加Logo信息
Dim width As Integer
Dim length As Integer
Dim yuv(32768) As Byte
Dim SDKResult as integer=LoadYUVFromBmpFile("E:\logo.bmp", yuv, 32768, width, length) <<-----在这里弹出异常。
异常信息如下:
未处理AccessVoilationException
尝试读取或写入受保护的内存。这通常指示其他内存已损坏。
这是我在SDK中的找到的例子代码:
int w,h;
unsigned char *bitsBuffer = (unsigned char *)malloc(128 * 128 * 2);
LoadYUVFromBmpFile("logo.bmp", bitsBuffer, 128 * 128 * 2, &w, &h);
对于C我不懂,所以麻烦大家帮我看一下,上述的C代码如何用VB.net实现呢?
分不够可以再加,拜托各位帮帮小弟,先谢过了。
#4
呵呵,自己搞定了。先谢谢大家。
不过还有一个问题,就是SetOsdDisplayMode函数了。我现在只能做到显示只有英文及符号的字符串,不知道如何才能显示中文信息呢?
我在网上找到一段代码,不过可惜又是C的,看不懂,呵呵,所以还得麻烦大家帮我转一下。谢谢。
代码如下:
*****----------------------------------------------------------------------------------------------------------------***********
因为在SetOsdDisplayMode( )函数中,用户有时需自定义OSD的内容,而Format1,Format2为USHORT参数,汉字为双字节,所以要做一些处理,简单代码如下:
USHORT format1[10];
Int i, j ;
Cstring Str;
Str=(LPCSTR)dlg.m_stChannelName;
format1[j++] =((Str.GetAt(i) & 0xff) <<8) | (Str.GetAt(i+1) &0xff);
*****----------------------------------------------------------------------------------------------------------------***********
麻烦大家帮我看看怎样用vb.net实现上述功能,谢谢。
不过还有一个问题,就是SetOsdDisplayMode函数了。我现在只能做到显示只有英文及符号的字符串,不知道如何才能显示中文信息呢?
我在网上找到一段代码,不过可惜又是C的,看不懂,呵呵,所以还得麻烦大家帮我转一下。谢谢。
代码如下:
*****----------------------------------------------------------------------------------------------------------------***********
因为在SetOsdDisplayMode( )函数中,用户有时需自定义OSD的内容,而Format1,Format2为USHORT参数,汉字为双字节,所以要做一些处理,简单代码如下:
USHORT format1[10];
Int i, j ;
Cstring Str;
Str=(LPCSTR)dlg.m_stChannelName;
format1[j++] =((Str.GetAt(i) & 0xff) <<8) | (Str.GetAt(i+1) &0xff);
*****----------------------------------------------------------------------------------------------------------------***********
麻烦大家帮我看看怎样用vb.net实现上述功能,谢谢。
#5
友情支持。。。
#6
自己顶一下。大家来帮帮忙啊,没有人知道吗?
#7
再顶。
#8
LZ在4楼贴的代码只是把一个字符串中指定位置的两个字节合并为1个宽字符,没有参考价值。
有一个API可以把多字节字符串转换为宽字符串,不过我感觉应该不用自己来转。
LZ现在的SetOsdDisplayMode函数是怎么声明的,怎么调用的?贴出来看看。
有一个API可以把多字节字符串转换为宽字符串,不过我感觉应该不用自己来转。
LZ现在的SetOsdDisplayMode函数是怎么声明的,怎么调用的?贴出来看看。
#9
cnzdgs(回贴亦是善举):
声明如下:
<DllImport("DS40xxSDK.dll", EntryPoint:="SetOsdDisplayMode", CharSet:=CharSet.Auto, SetLastError:=True, ExactSpelling:=True, CallingConvention:=CallingConvention.StdCall)> Public Function SetOsdDisplayMode(ByVal hChannelHandle As IntPtr, ByVal Brightness As Integer, ByVal Translucent As Boolean, ByVal TwinkleInterval As Integer, ByVal Format1() As UShort, ByVal Format2() As UShort) As Integer
End Function
现在的问题是:我可以正确显示出英文及字符,却不知道该怎样显示一个中文字符。
我在代码中调用如下:
叠加OSD字幕信息
Dim Format1() As UShort={96,30,_OSD_YEAR4,Asc("-"),_OSD_MONTH2,Asc("-"),_OSD_DAY,Asc("-"),_OSD_HOUR24,Asc(":"),_OSD_MINUTE,Asc(":"),_OSD_SECOND, 0}
Dim Format2() As UShort = {96, 45, Asc("C"), Asc("H"), Asc(":"), Asc("1"), 0}
SetOsdDisplayMode(_ChHandle, 255,True,1,Format1,Format2)
参数说明祥见1楼。
运行后在视频上的显示如下:
2007-12-31-22:00:00
CH:1
我想把显示改成类似以下的:
2007年12月31日22:00:00
频道:XXXX 'XXXX为中文频道名称
请问,应该怎样实现呢?谢谢。
声明如下:
<DllImport("DS40xxSDK.dll", EntryPoint:="SetOsdDisplayMode", CharSet:=CharSet.Auto, SetLastError:=True, ExactSpelling:=True, CallingConvention:=CallingConvention.StdCall)> Public Function SetOsdDisplayMode(ByVal hChannelHandle As IntPtr, ByVal Brightness As Integer, ByVal Translucent As Boolean, ByVal TwinkleInterval As Integer, ByVal Format1() As UShort, ByVal Format2() As UShort) As Integer
End Function
现在的问题是:我可以正确显示出英文及字符,却不知道该怎样显示一个中文字符。
我在代码中调用如下:
叠加OSD字幕信息
Dim Format1() As UShort={96,30,_OSD_YEAR4,Asc("-"),_OSD_MONTH2,Asc("-"),_OSD_DAY,Asc("-"),_OSD_HOUR24,Asc(":"),_OSD_MINUTE,Asc(":"),_OSD_SECOND, 0}
Dim Format2() As UShort = {96, 45, Asc("C"), Asc("H"), Asc(":"), Asc("1"), 0}
SetOsdDisplayMode(_ChHandle, 255,True,1,Format1,Format2)
参数说明祥见1楼。
运行后在视频上的显示如下:
2007-12-31-22:00:00
CH:1
我想把显示改成类似以下的:
2007年12月31日22:00:00
频道:XXXX 'XXXX为中文频道名称
请问,应该怎样实现呢?谢谢。
#10
把Asc换成ChrW试试。
#11
写错了,Asc换成AscW试试。
#12
mark
#13
cnzdgs(回贴亦是善举):
按照你的方法,不行啊。显示出来的是乱码呀。
按照你的方法,不行啊。显示出来的是乱码呀。
#14
看来是你调用的这个dll不支持中文,你这样试试,麻烦一些。
例如:“年”
Dim ChineseWord as Integer
Dim Byte1 as Byte
Dim Byte2 as Byte
ChineseWord = Asc("年")
Byte1 = ChineseWord And 255
Byte2 = ChineseWord >> 8 And 255
在Format1中,用Byte1,Byte2代替Asc("年")。
例如:“年”
Dim ChineseWord as Integer
Dim Byte1 as Byte
Dim Byte2 as Byte
ChineseWord = Asc("年")
Byte1 = ChineseWord And 255
Byte2 = ChineseWord >> 8 And 255
在Format1中,用Byte1,Byte2代替Asc("年")。
#15
很感谢您的帮助。
按照上面的方法试过了,还是不行,依旧是乱码。
您提到过有一个API可以把多字节字符串转换为宽字符串,是否可以指教一下呢?
谢谢。
按照上面的方法试过了,还是不行,依旧是乱码。
您提到过有一个API可以把多字节字符串转换为宽字符串,是否可以指教一下呢?
谢谢。
#16
那个API是MultiByteToWideChar。
但现在的问题不是字符串转换,用AscW("年")得到的就是Unicode,是你调用的这个Dll不支持中文。
我在14楼给出的代码,你再改一下试试,把Byte1和Byte2对调一下,如果不行再把Asc换成AscW,再不行再对调一下Byte1和Byte2,一共有这4种组合都试一下,如果还不行可能就没办法了。
我再帮你想想。
但现在的问题不是字符串转换,用AscW("年")得到的就是Unicode,是你调用的这个Dll不支持中文。
我在14楼给出的代码,你再改一下试试,把Byte1和Byte2对调一下,如果不行再把Asc换成AscW,再不行再对调一下Byte1和Byte2,一共有这4种组合都试一下,如果还不行可能就没办法了。
我再帮你想想。
#17
试过了,还是不行。
这个Dll应该是支持中文的。因为在SDK的说明中已经说明了可以使用中文。下面是对这个函数的说明:
SetOsdDisplayMode(HANDLE hChannelHandle, int Brightness, BOOL Translucent, int TwinkleInterval, USHORT *Format1, USHORT *Format2)
参数:HANDLE hChannelHandle 通道句柄
int Brightness OSD显示亮度,255最亮,0最暗;
BOOL Translucent OSD图象是否做半透明处理;
Int TwinkleInterval (V3.2改动为:当值为1时,OSD的亮度根据背景的亮度来调整,但背景较亮时,OSD亮度自动调低,但背景较暗时,OSD亮度自动调亮。原来的闪烁功能关闭)3.2版本之前请参考4.41节描述。
USHORT *Forma1,* Format2 描述字符叠加的位置和次序的格式
串,具体定义如下:
USHORT X, USHORT Y, CHAR0, CHAR1, CHAR2,… CHARN, NULL
其中X,Y 是该字串在标准CIF图象的起始位置,X必须是8的倍数,Y可以在图象高度内取值即(0-287)PAL 、(0-239)NTSC;CHARN也是USHORT型的参数,可以是ASCII码也可以是汉字,当想要显示当前时间时,可以指定为固定的时间定义值,其值如下:
_OSD_YEAR4 四位的年显示,如2002
_OSD_YEAR2 两位的年显示,如02
_OSD_MONTH3 英文的月显示,如 Jan
_OSD_MONTH2 两位阿拉伯数字的月显示,如07
_OSD_DAY 两位的阿拉伯数字的日显示,如31
_OSD_WEEK3 英文的星期显示,如Tue
_OSD_CWEEK1 中文的星期显示,如星期二
_OSD_HOUR24 24小时的时钟显示,如18
_OSD_HOUR12 12小时的时钟显示,如AM09或PM09
_OSD_MINUTE 两位分钟的显示
_OSD_SECOND 两位秒的显示
在格式字符串的最后必须以NULL(0)结尾,否则会显示错误的内容。
字符串和时间显示可以在FORMAT1 也可以在FORAMT2,也可以混合在一起,但不得超过一行CIF 图象的宽度。
要显示位置在16,19的字符串“办公室”的格式字符串如下:
USHORT Format[] = {16, 19, ‘办’,’公’,’室’, ‘\0’};
要显示位置在8, 3的时间字符串可以如下:
USHORT Format[]={8, 3, _OSD_YEAR4, ‘年’,_OSD_MONTH2,’月’,_OSD_DAY, ‘日’,_OSD_HOUR24,’:’, _OSD_MINUTE, ‘:’, _OSD_SECOND, ‘\0’};
如果只想显示其中一行,则将起始的字符串定义如下:
USHORT FormatNoDisplay[]={0, 0, ‘\0’};
按照SDK中的说明及例子,Dll应该是支持中文的。过去我手头上有一个监控程序,调用的就是这个Dll,在那个程序里,OSD也是可以显示中文的。所以我想应该不是Dll的问题。我猜想会不会是格式字符串的最后一位的问题呢?因为在说明中提到了"在格式字符串的最后必须以NULL(0)结尾,否则会显示错误的内容"。下面的示例中数组的最后一个元素是'\0',会不会是这个原因导致的呢?
这个Dll应该是支持中文的。因为在SDK的说明中已经说明了可以使用中文。下面是对这个函数的说明:
SetOsdDisplayMode(HANDLE hChannelHandle, int Brightness, BOOL Translucent, int TwinkleInterval, USHORT *Format1, USHORT *Format2)
参数:HANDLE hChannelHandle 通道句柄
int Brightness OSD显示亮度,255最亮,0最暗;
BOOL Translucent OSD图象是否做半透明处理;
Int TwinkleInterval (V3.2改动为:当值为1时,OSD的亮度根据背景的亮度来调整,但背景较亮时,OSD亮度自动调低,但背景较暗时,OSD亮度自动调亮。原来的闪烁功能关闭)3.2版本之前请参考4.41节描述。
USHORT *Forma1,* Format2 描述字符叠加的位置和次序的格式
串,具体定义如下:
USHORT X, USHORT Y, CHAR0, CHAR1, CHAR2,… CHARN, NULL
其中X,Y 是该字串在标准CIF图象的起始位置,X必须是8的倍数,Y可以在图象高度内取值即(0-287)PAL 、(0-239)NTSC;CHARN也是USHORT型的参数,可以是ASCII码也可以是汉字,当想要显示当前时间时,可以指定为固定的时间定义值,其值如下:
_OSD_YEAR4 四位的年显示,如2002
_OSD_YEAR2 两位的年显示,如02
_OSD_MONTH3 英文的月显示,如 Jan
_OSD_MONTH2 两位阿拉伯数字的月显示,如07
_OSD_DAY 两位的阿拉伯数字的日显示,如31
_OSD_WEEK3 英文的星期显示,如Tue
_OSD_CWEEK1 中文的星期显示,如星期二
_OSD_HOUR24 24小时的时钟显示,如18
_OSD_HOUR12 12小时的时钟显示,如AM09或PM09
_OSD_MINUTE 两位分钟的显示
_OSD_SECOND 两位秒的显示
在格式字符串的最后必须以NULL(0)结尾,否则会显示错误的内容。
字符串和时间显示可以在FORMAT1 也可以在FORAMT2,也可以混合在一起,但不得超过一行CIF 图象的宽度。
要显示位置在16,19的字符串“办公室”的格式字符串如下:
USHORT Format[] = {16, 19, ‘办’,’公’,’室’, ‘\0’};
要显示位置在8, 3的时间字符串可以如下:
USHORT Format[]={8, 3, _OSD_YEAR4, ‘年’,_OSD_MONTH2,’月’,_OSD_DAY, ‘日’,_OSD_HOUR24,’:’, _OSD_MINUTE, ‘:’, _OSD_SECOND, ‘\0’};
如果只想显示其中一行,则将起始的字符串定义如下:
USHORT FormatNoDisplay[]={0, 0, ‘\0’};
按照SDK中的说明及例子,Dll应该是支持中文的。过去我手头上有一个监控程序,调用的就是这个Dll,在那个程序里,OSD也是可以显示中文的。所以我想应该不是Dll的问题。我猜想会不会是格式字符串的最后一位的问题呢?因为在说明中提到了"在格式字符串的最后必须以NULL(0)结尾,否则会显示错误的内容"。下面的示例中数组的最后一个元素是'\0',会不会是这个原因导致的呢?
#18
按上面的说明,给Asc("年")就可以,如果是要求Unicode就用AscW("年"),但你已经试过了不行。
#1
我用VB2005写了一个,你参考一下吧。
Public Declare Ansi Function LoadYUVFromBmpFile Lib "动态库名称.dll" (ByVal FileName As String, ByVal yuv As Byte(), ByVal BufLen As Integer, ByRef Width As Integer, ByRef Height As Integer) As Integer
Public Declare Ansi Sub SetOsdDisplayMode Lib "动态库名称.dll" (ByVal hChannelHandle As UInteger, ByVal Brightness As Integer, ByVal Translucent As Boolean, ByVal TwinkleInterval As Integer, ByVal Format1 As UInt16(), ByVal Format2 As UInt16())
#2
看一下头文件是在哪个文件里引入那个文件.
你查一下.在.NET DRAWN命令空间有没有这样类似的函数.
应该是有的..
你查一下.在.NET DRAWN命令空间有没有这样类似的函数.
应该是有的..
#3
cnzdgs(回贴亦是善举):
我按照你的声明试过了,还是不行啊。
对于LoadYUVFromBmpFile,按照你的方法:
Public Declare Ansi Function LoadYUVFromBmpFile Lib "动态库名称.dll" (ByVal FileName As String, ByVal yuv As Byte(), ByVal BufLen As Integer, ByRef Width As Integer, ByRef Height As Integer) As Integer
然后在代码中如此调用:
'叠加Logo信息
Dim width As Integer
Dim length As Integer
Dim yuv(32768) As Byte
Dim SDKResult as integer=LoadYUVFromBmpFile("E:\logo.bmp", yuv, 32768, width, length) <<-----在这里弹出异常。
异常信息如下:
未处理AccessVoilationException
尝试读取或写入受保护的内存。这通常指示其他内存已损坏。
这是我在SDK中的找到的例子代码:
int w,h;
unsigned char *bitsBuffer = (unsigned char *)malloc(128 * 128 * 2);
LoadYUVFromBmpFile("logo.bmp", bitsBuffer, 128 * 128 * 2, &w, &h);
对于C我不懂,所以麻烦大家帮我看一下,上述的C代码如何用VB.net实现呢?
分不够可以再加,拜托各位帮帮小弟,先谢过了。
我按照你的声明试过了,还是不行啊。
对于LoadYUVFromBmpFile,按照你的方法:
Public Declare Ansi Function LoadYUVFromBmpFile Lib "动态库名称.dll" (ByVal FileName As String, ByVal yuv As Byte(), ByVal BufLen As Integer, ByRef Width As Integer, ByRef Height As Integer) As Integer
然后在代码中如此调用:
'叠加Logo信息
Dim width As Integer
Dim length As Integer
Dim yuv(32768) As Byte
Dim SDKResult as integer=LoadYUVFromBmpFile("E:\logo.bmp", yuv, 32768, width, length) <<-----在这里弹出异常。
异常信息如下:
未处理AccessVoilationException
尝试读取或写入受保护的内存。这通常指示其他内存已损坏。
这是我在SDK中的找到的例子代码:
int w,h;
unsigned char *bitsBuffer = (unsigned char *)malloc(128 * 128 * 2);
LoadYUVFromBmpFile("logo.bmp", bitsBuffer, 128 * 128 * 2, &w, &h);
对于C我不懂,所以麻烦大家帮我看一下,上述的C代码如何用VB.net实现呢?
分不够可以再加,拜托各位帮帮小弟,先谢过了。
#4
呵呵,自己搞定了。先谢谢大家。
不过还有一个问题,就是SetOsdDisplayMode函数了。我现在只能做到显示只有英文及符号的字符串,不知道如何才能显示中文信息呢?
我在网上找到一段代码,不过可惜又是C的,看不懂,呵呵,所以还得麻烦大家帮我转一下。谢谢。
代码如下:
*****----------------------------------------------------------------------------------------------------------------***********
因为在SetOsdDisplayMode( )函数中,用户有时需自定义OSD的内容,而Format1,Format2为USHORT参数,汉字为双字节,所以要做一些处理,简单代码如下:
USHORT format1[10];
Int i, j ;
Cstring Str;
Str=(LPCSTR)dlg.m_stChannelName;
format1[j++] =((Str.GetAt(i) & 0xff) <<8) | (Str.GetAt(i+1) &0xff);
*****----------------------------------------------------------------------------------------------------------------***********
麻烦大家帮我看看怎样用vb.net实现上述功能,谢谢。
不过还有一个问题,就是SetOsdDisplayMode函数了。我现在只能做到显示只有英文及符号的字符串,不知道如何才能显示中文信息呢?
我在网上找到一段代码,不过可惜又是C的,看不懂,呵呵,所以还得麻烦大家帮我转一下。谢谢。
代码如下:
*****----------------------------------------------------------------------------------------------------------------***********
因为在SetOsdDisplayMode( )函数中,用户有时需自定义OSD的内容,而Format1,Format2为USHORT参数,汉字为双字节,所以要做一些处理,简单代码如下:
USHORT format1[10];
Int i, j ;
Cstring Str;
Str=(LPCSTR)dlg.m_stChannelName;
format1[j++] =((Str.GetAt(i) & 0xff) <<8) | (Str.GetAt(i+1) &0xff);
*****----------------------------------------------------------------------------------------------------------------***********
麻烦大家帮我看看怎样用vb.net实现上述功能,谢谢。
#5
友情支持。。。
#6
自己顶一下。大家来帮帮忙啊,没有人知道吗?
#7
再顶。
#8
LZ在4楼贴的代码只是把一个字符串中指定位置的两个字节合并为1个宽字符,没有参考价值。
有一个API可以把多字节字符串转换为宽字符串,不过我感觉应该不用自己来转。
LZ现在的SetOsdDisplayMode函数是怎么声明的,怎么调用的?贴出来看看。
有一个API可以把多字节字符串转换为宽字符串,不过我感觉应该不用自己来转。
LZ现在的SetOsdDisplayMode函数是怎么声明的,怎么调用的?贴出来看看。
#9
cnzdgs(回贴亦是善举):
声明如下:
<DllImport("DS40xxSDK.dll", EntryPoint:="SetOsdDisplayMode", CharSet:=CharSet.Auto, SetLastError:=True, ExactSpelling:=True, CallingConvention:=CallingConvention.StdCall)> Public Function SetOsdDisplayMode(ByVal hChannelHandle As IntPtr, ByVal Brightness As Integer, ByVal Translucent As Boolean, ByVal TwinkleInterval As Integer, ByVal Format1() As UShort, ByVal Format2() As UShort) As Integer
End Function
现在的问题是:我可以正确显示出英文及字符,却不知道该怎样显示一个中文字符。
我在代码中调用如下:
叠加OSD字幕信息
Dim Format1() As UShort={96,30,_OSD_YEAR4,Asc("-"),_OSD_MONTH2,Asc("-"),_OSD_DAY,Asc("-"),_OSD_HOUR24,Asc(":"),_OSD_MINUTE,Asc(":"),_OSD_SECOND, 0}
Dim Format2() As UShort = {96, 45, Asc("C"), Asc("H"), Asc(":"), Asc("1"), 0}
SetOsdDisplayMode(_ChHandle, 255,True,1,Format1,Format2)
参数说明祥见1楼。
运行后在视频上的显示如下:
2007-12-31-22:00:00
CH:1
我想把显示改成类似以下的:
2007年12月31日22:00:00
频道:XXXX 'XXXX为中文频道名称
请问,应该怎样实现呢?谢谢。
声明如下:
<DllImport("DS40xxSDK.dll", EntryPoint:="SetOsdDisplayMode", CharSet:=CharSet.Auto, SetLastError:=True, ExactSpelling:=True, CallingConvention:=CallingConvention.StdCall)> Public Function SetOsdDisplayMode(ByVal hChannelHandle As IntPtr, ByVal Brightness As Integer, ByVal Translucent As Boolean, ByVal TwinkleInterval As Integer, ByVal Format1() As UShort, ByVal Format2() As UShort) As Integer
End Function
现在的问题是:我可以正确显示出英文及字符,却不知道该怎样显示一个中文字符。
我在代码中调用如下:
叠加OSD字幕信息
Dim Format1() As UShort={96,30,_OSD_YEAR4,Asc("-"),_OSD_MONTH2,Asc("-"),_OSD_DAY,Asc("-"),_OSD_HOUR24,Asc(":"),_OSD_MINUTE,Asc(":"),_OSD_SECOND, 0}
Dim Format2() As UShort = {96, 45, Asc("C"), Asc("H"), Asc(":"), Asc("1"), 0}
SetOsdDisplayMode(_ChHandle, 255,True,1,Format1,Format2)
参数说明祥见1楼。
运行后在视频上的显示如下:
2007-12-31-22:00:00
CH:1
我想把显示改成类似以下的:
2007年12月31日22:00:00
频道:XXXX 'XXXX为中文频道名称
请问,应该怎样实现呢?谢谢。
#10
把Asc换成ChrW试试。
#11
写错了,Asc换成AscW试试。
#12
mark
#13
cnzdgs(回贴亦是善举):
按照你的方法,不行啊。显示出来的是乱码呀。
按照你的方法,不行啊。显示出来的是乱码呀。
#14
看来是你调用的这个dll不支持中文,你这样试试,麻烦一些。
例如:“年”
Dim ChineseWord as Integer
Dim Byte1 as Byte
Dim Byte2 as Byte
ChineseWord = Asc("年")
Byte1 = ChineseWord And 255
Byte2 = ChineseWord >> 8 And 255
在Format1中,用Byte1,Byte2代替Asc("年")。
例如:“年”
Dim ChineseWord as Integer
Dim Byte1 as Byte
Dim Byte2 as Byte
ChineseWord = Asc("年")
Byte1 = ChineseWord And 255
Byte2 = ChineseWord >> 8 And 255
在Format1中,用Byte1,Byte2代替Asc("年")。
#15
很感谢您的帮助。
按照上面的方法试过了,还是不行,依旧是乱码。
您提到过有一个API可以把多字节字符串转换为宽字符串,是否可以指教一下呢?
谢谢。
按照上面的方法试过了,还是不行,依旧是乱码。
您提到过有一个API可以把多字节字符串转换为宽字符串,是否可以指教一下呢?
谢谢。
#16
那个API是MultiByteToWideChar。
但现在的问题不是字符串转换,用AscW("年")得到的就是Unicode,是你调用的这个Dll不支持中文。
我在14楼给出的代码,你再改一下试试,把Byte1和Byte2对调一下,如果不行再把Asc换成AscW,再不行再对调一下Byte1和Byte2,一共有这4种组合都试一下,如果还不行可能就没办法了。
我再帮你想想。
但现在的问题不是字符串转换,用AscW("年")得到的就是Unicode,是你调用的这个Dll不支持中文。
我在14楼给出的代码,你再改一下试试,把Byte1和Byte2对调一下,如果不行再把Asc换成AscW,再不行再对调一下Byte1和Byte2,一共有这4种组合都试一下,如果还不行可能就没办法了。
我再帮你想想。
#17
试过了,还是不行。
这个Dll应该是支持中文的。因为在SDK的说明中已经说明了可以使用中文。下面是对这个函数的说明:
SetOsdDisplayMode(HANDLE hChannelHandle, int Brightness, BOOL Translucent, int TwinkleInterval, USHORT *Format1, USHORT *Format2)
参数:HANDLE hChannelHandle 通道句柄
int Brightness OSD显示亮度,255最亮,0最暗;
BOOL Translucent OSD图象是否做半透明处理;
Int TwinkleInterval (V3.2改动为:当值为1时,OSD的亮度根据背景的亮度来调整,但背景较亮时,OSD亮度自动调低,但背景较暗时,OSD亮度自动调亮。原来的闪烁功能关闭)3.2版本之前请参考4.41节描述。
USHORT *Forma1,* Format2 描述字符叠加的位置和次序的格式
串,具体定义如下:
USHORT X, USHORT Y, CHAR0, CHAR1, CHAR2,… CHARN, NULL
其中X,Y 是该字串在标准CIF图象的起始位置,X必须是8的倍数,Y可以在图象高度内取值即(0-287)PAL 、(0-239)NTSC;CHARN也是USHORT型的参数,可以是ASCII码也可以是汉字,当想要显示当前时间时,可以指定为固定的时间定义值,其值如下:
_OSD_YEAR4 四位的年显示,如2002
_OSD_YEAR2 两位的年显示,如02
_OSD_MONTH3 英文的月显示,如 Jan
_OSD_MONTH2 两位阿拉伯数字的月显示,如07
_OSD_DAY 两位的阿拉伯数字的日显示,如31
_OSD_WEEK3 英文的星期显示,如Tue
_OSD_CWEEK1 中文的星期显示,如星期二
_OSD_HOUR24 24小时的时钟显示,如18
_OSD_HOUR12 12小时的时钟显示,如AM09或PM09
_OSD_MINUTE 两位分钟的显示
_OSD_SECOND 两位秒的显示
在格式字符串的最后必须以NULL(0)结尾,否则会显示错误的内容。
字符串和时间显示可以在FORMAT1 也可以在FORAMT2,也可以混合在一起,但不得超过一行CIF 图象的宽度。
要显示位置在16,19的字符串“办公室”的格式字符串如下:
USHORT Format[] = {16, 19, ‘办’,’公’,’室’, ‘\0’};
要显示位置在8, 3的时间字符串可以如下:
USHORT Format[]={8, 3, _OSD_YEAR4, ‘年’,_OSD_MONTH2,’月’,_OSD_DAY, ‘日’,_OSD_HOUR24,’:’, _OSD_MINUTE, ‘:’, _OSD_SECOND, ‘\0’};
如果只想显示其中一行,则将起始的字符串定义如下:
USHORT FormatNoDisplay[]={0, 0, ‘\0’};
按照SDK中的说明及例子,Dll应该是支持中文的。过去我手头上有一个监控程序,调用的就是这个Dll,在那个程序里,OSD也是可以显示中文的。所以我想应该不是Dll的问题。我猜想会不会是格式字符串的最后一位的问题呢?因为在说明中提到了"在格式字符串的最后必须以NULL(0)结尾,否则会显示错误的内容"。下面的示例中数组的最后一个元素是'\0',会不会是这个原因导致的呢?
这个Dll应该是支持中文的。因为在SDK的说明中已经说明了可以使用中文。下面是对这个函数的说明:
SetOsdDisplayMode(HANDLE hChannelHandle, int Brightness, BOOL Translucent, int TwinkleInterval, USHORT *Format1, USHORT *Format2)
参数:HANDLE hChannelHandle 通道句柄
int Brightness OSD显示亮度,255最亮,0最暗;
BOOL Translucent OSD图象是否做半透明处理;
Int TwinkleInterval (V3.2改动为:当值为1时,OSD的亮度根据背景的亮度来调整,但背景较亮时,OSD亮度自动调低,但背景较暗时,OSD亮度自动调亮。原来的闪烁功能关闭)3.2版本之前请参考4.41节描述。
USHORT *Forma1,* Format2 描述字符叠加的位置和次序的格式
串,具体定义如下:
USHORT X, USHORT Y, CHAR0, CHAR1, CHAR2,… CHARN, NULL
其中X,Y 是该字串在标准CIF图象的起始位置,X必须是8的倍数,Y可以在图象高度内取值即(0-287)PAL 、(0-239)NTSC;CHARN也是USHORT型的参数,可以是ASCII码也可以是汉字,当想要显示当前时间时,可以指定为固定的时间定义值,其值如下:
_OSD_YEAR4 四位的年显示,如2002
_OSD_YEAR2 两位的年显示,如02
_OSD_MONTH3 英文的月显示,如 Jan
_OSD_MONTH2 两位阿拉伯数字的月显示,如07
_OSD_DAY 两位的阿拉伯数字的日显示,如31
_OSD_WEEK3 英文的星期显示,如Tue
_OSD_CWEEK1 中文的星期显示,如星期二
_OSD_HOUR24 24小时的时钟显示,如18
_OSD_HOUR12 12小时的时钟显示,如AM09或PM09
_OSD_MINUTE 两位分钟的显示
_OSD_SECOND 两位秒的显示
在格式字符串的最后必须以NULL(0)结尾,否则会显示错误的内容。
字符串和时间显示可以在FORMAT1 也可以在FORAMT2,也可以混合在一起,但不得超过一行CIF 图象的宽度。
要显示位置在16,19的字符串“办公室”的格式字符串如下:
USHORT Format[] = {16, 19, ‘办’,’公’,’室’, ‘\0’};
要显示位置在8, 3的时间字符串可以如下:
USHORT Format[]={8, 3, _OSD_YEAR4, ‘年’,_OSD_MONTH2,’月’,_OSD_DAY, ‘日’,_OSD_HOUR24,’:’, _OSD_MINUTE, ‘:’, _OSD_SECOND, ‘\0’};
如果只想显示其中一行,则将起始的字符串定义如下:
USHORT FormatNoDisplay[]={0, 0, ‘\0’};
按照SDK中的说明及例子,Dll应该是支持中文的。过去我手头上有一个监控程序,调用的就是这个Dll,在那个程序里,OSD也是可以显示中文的。所以我想应该不是Dll的问题。我猜想会不会是格式字符串的最后一位的问题呢?因为在说明中提到了"在格式字符串的最后必须以NULL(0)结尾,否则会显示错误的内容"。下面的示例中数组的最后一个元素是'\0',会不会是这个原因导致的呢?
#18
按上面的说明,给Asc("年")就可以,如果是要求Unicode就用AscW("年"),但你已经试过了不行。