如何能把char* 转成safe array of Bytes

fly3high 2016-03-13 04:59:40
以前在处理图像时,是先把摄像头的内容直接转成jpg保存到硬盘,然后程序去读这个文件,这样效率太慢,想能不保存到本地,直接处理。
查了下提供的函数,可以传文件,也可以传image stream.
object.DecodeStream(FileStream)
FileStream: A Variant that contains a safe array of Bytes.

从摄像头取出的数据是:
char* m_pcImageMemory[0]; // camera memory - pointer to buffer



sample 提供的例子是:

//prepare the image stream
CString sFileName;
m_Edit1.GetWindowText( sFileName );
HANDLE hFile = ::CreateFile( sFileName, GENERIC_READ, 0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL );
if( hFile == INVALID_HANDLE_VALUE )
{
AfxMessageBox( _T("Cant open the file") );
return;
}

DWORD dwFileSize = ::GetFileSize( hFile, NULL );


BYTE* pBuf = new BYTE[dwFileSize];

DWORD dwNumberOfBytesRead ;
if( !::ReadFile(hFile, pBuf, dwFileSize, &dwNumberOfBytesRead, NULL) )
{
AfxMessageBox( _T("Cant read the file") );
return;
}
::CloseHandle( hFile );

CComVariant var;
var.vt = VT_ARRAY | VT_UI1;
var.parray = SafeArrayCreateVector( VT_UI1, 0, dwFileSize );
if( !var.parray ) return ;

//lock safe array
BYTE* pSaBuf=NULL;
if( SUCCEEDED(SafeArrayAccessData(var.parray, (void HUGEP**)&pSaBuf)) )
{
//copy image into the safe array
memcpy( pSaBuf, pBuf, dwFileSize );
//unlock safe array
SafeArrayUnaccessData( var.parray );
}

//find barcodes in the image stream (doesnt use any file)
hr = pIBarcodeDecoder->DecodeStream( var );


问题是如何能把char* 转成safe array of Bytes
...全文
124 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
schlafenhamster 2016-03-15
  • 打赏
  • 举报
回复
按那个例子搞,就是 memcpy( pSaBuf, m_pcImageMemory, dwFileSize ); void *memcpy( void *dest, const void *src, size_t count ); 都是 void * 也可以使用windows的 CopyMemory The CopyMemory function copies a block of memory from one location to another. VOID CopyMemory( PVOID Destination, // pointer to address of copy destination CONST VOID *Source, // pointer to address of block to copy DWORD Length // size, in bytes, of block to copy );
fly3high 2016-03-14
  • 打赏
  • 举报
回复
引用 5 楼 schlafenhamster 的回复:
这句: memcpy( pSaBuf, m_pcImageMemory, dwFileSize ); 与 char byte 无关
那要进行特殊处理么?
fly3high 2016-03-14
  • 打赏
  • 举报
回复
引用 6 楼 Saleayas 的回复:
我觉得直接创建 IStream 实例就可以了。 SafeArray 在保存 字节数组的时候,使用的 VARIANT 来保存。 在使用的时候,不能直接转换为 字节数组。而是 VARIANT(V_UI) 数组。
愿闻其详... 你是指用stringstream<<m_pcImageMemory[0]?
Saleayas 2016-03-13
  • 打赏
  • 举报
回复
我觉得直接创建 IStream 实例就可以了。 SafeArray 在保存 字节数组的时候,使用的 VARIANT 来保存。 在使用的时候,不能直接转换为 字节数组。而是 VARIANT(V_UI) 数组。
schlafenhamster 2016-03-13
  • 打赏
  • 举报
回复
这句: memcpy( pSaBuf, m_pcImageMemory, dwFileSize ); 与 char byte 无关
fly3high 2016-03-13
  • 打赏
  • 举报
回复
引用 3 楼 schlafenhamster 的回复:
摄像头里自己定义的是char * 强转为 BYTE* 行不行 ?
不行,摄像头程序定死的
schlafenhamster 2016-03-13
  • 打赏
  • 举报
回复
摄像头里自己定义的是char * 强转为 BYTE* 行不行 ?
fly3high 2016-03-13
  • 打赏
  • 举报
回复
引用 1 楼 schlafenhamster 的回复:
char * m_pcImageMemory[0]; BYTE ^ m_pcImageMemory[0]; 不行吗 ?
你是说强转么? 摄像头里自己定义的是char *
schlafenhamster 2016-03-13
  • 打赏
  • 举报
回复
char * m_pcImageMemory[0]; BYTE ^ m_pcImageMemory[0]; 不行吗 ?

16,472

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧