如何使用LEADTOOLS 19将图像效果应用于内存缓冲区中的JPEG

时间:2016-05-02 17:21:28

标签: c++ bitmap leadtools-sdk

我正在使用C ++,LEADTOOLS19和VS2015制作Windows可执行文件,以便从服务器读取图像,使用LEADTOOLS将图像效果应用于它,并在浏览器中显示。

服务器将图像作为包含图像的JPEG编码(以“ÿØÿà”开头)和此缓冲区长度的字符数组提供给我。大多数LEADTOOLS函数从文件中读取图像,但我不想将其写入磁盘只是为了将其作为位图读取。

我尝试的第一件事是StartFeedLoad函数:

//pImageData is the buffer of JPEG data, and imageLength is the 
//server-provided size of pImageData in bytes
LBuffer buf((L_VOID *)pImageData, imageLength);
LFile   imgFile;
LBitmap bitmap;

imgFile.SetBitmap(&imgbitmap);

// Initialize the file-load process
imgmemfile.StartFeedLoad(8, 0,
    LOADFILE_ALLOCATE | LOADFILE_STORE, NULL);
imgmemfile.FeedLoad(&buf);
imgmemfile.StopFeedLoad();

使用此代码,我在尝试运行StartFeedLoad时遇到此异常:

Exception thrown at 0x000007F855BC2662 (ltwvcax.dll) in getimage.exe:
0xC0000005: Access violation reading location 0x0000000000000148.

在调用StartFeedLoad之前我尝试了一些不同的东西,并尝试更改我传递的参数,但每次都得到该异常。

由于这不起作用,我尝试的下一个方法是使用LEADTOOLS库LMemoryFile类将缓冲区保存为内存文件:

LBuffer buf((L_VOID *)pImageData, imageLength);
LMemoryFile imgmemfile;
BITMAPHANDLE pbit;

//The bitmap the image will be loaded into
LBitmap bitmap;
imgmemfile.SetBitmap(&bitmap);

//Load the buffer to the image
ret = imgmemfile.LoadMemory(buf, 0, ORDER_RGBORGRAY, LOADFILE_ALLOCATE |   LOADFILE_STORE, NULL);

此时,LoadMemory返回WRPERR_INVALID_PARAMETERS:指定了一个或多个无效参数。我尝试了不同的bitsPerPixel值,颜色顺序,有或没有添加另一个NULL参数作为fileInfo但仍然得到相同的错误。

我觉得我需要做一些其他事情来“准备”加载位图,但我不知道它的大小或其他任何东西来初始化它。

谢谢!

编辑5/9/16:添加了Leadtools指示的“GetInfo”:

//Load image
LBuffer buf((L_VOID *)pImageData, imageLength);
//LFile imgmemfile;
FILEINFO fileInfo = FILEINFO(); 
LMemoryFile imgmemfile;
BITMAPHANDLE pbit;

if (LBase::GetLoadedLibraries() & LT_FIL == 0)
    return false; 

LBitmap bitmap;
imgmemfile.SetBitmap(&bitmap);
ret = imgmemfile.GetInfo(buf, &fileInfo, sizeof(FILEINFO), 0, NULL);
ret = imgmemfile.LoadMemory(buf, 0, ORDER_RGBORGRAY, LOADFILE_ALLOCATE | LOADFILE_STORE, NULL, &fileInfo);
ret = imgmemfile.Save(&buf, FILE_JPEG, 8, 30, NULL);

代码超过了额外的库检查,但GetInfo返回-2041,表示未加载LTFIL。

2 个答案:

答案 0 :(得分:1)

如果您在开始时将整个文件放在内存中,则应该使用LMemoryFile :: GetInfo和LMemoryFile :: LoadMemory。如果你不这样做,那么FeedLoad就是你要走的路。这里有一个例子:https://www.leadtools.com/help/leadtools/v19/main/clib/lfile__startfeedload.html

您可以在LEADTOOLS安装文件夹中找到完整的工作示例:C:\ LEADTOOLS 19 \ Examples \ ClassLibrary \ MSVC \ FeedLoad

答案 1 :(得分:0)

LEADTOOLS支持给我的功能是正确的,但我仍然是这个问题,因为我链接到Leadtools C ++类库(Ltwvc_x.lib和Ltwvc_ax.lib)的Unicode和ANSI版本。当我删除Unicode库(从我的ANSI项目)一切正常。