如何使用 LEADTOOLS 19 将图像效果应用于内存缓冲区中的 JPEG
How to apply image effects to a JPEG in a memory buffer using LEADTOOLS 19
我正在使用 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 class:
将缓冲区保存为内存文件
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 returns WRPERR_INVALID_PARAMETERS: 指定了一个或多个无效参数。我尝试了不同的 bitsPerPixel 值、颜色顺序,以及添加或不添加另一个 NULL 参数作为 fileInfo,但仍然出现相同的错误。
我觉得我需要做一些其他事情来 "prep" 要加载的位图,但我不知道它的大小或其他任何东西来初始化它。
谢谢!
编辑 2016 年 5 月 9 日:添加了 "GetInfo",如 Leadtools 所示:
//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 returns -2041,表明未加载 LTFIL。
如果开始时整个文件都在内存中,则应使用 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
LEADTOOLS 支持人员给我的功能是正确的,但我仍然遇到这个问题,因为我正在链接到 Leadtools C++ class 库的 Unicode 和 ANSI 版本(Ltwvc_x.lib 和Ltwvc_ax.lib)。当我删除 Unicode 库(从我的 ANSI 项目中)时,一切正常。
我正在使用 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 class:
将缓冲区保存为内存文件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 returns WRPERR_INVALID_PARAMETERS: 指定了一个或多个无效参数。我尝试了不同的 bitsPerPixel 值、颜色顺序,以及添加或不添加另一个 NULL 参数作为 fileInfo,但仍然出现相同的错误。
我觉得我需要做一些其他事情来 "prep" 要加载的位图,但我不知道它的大小或其他任何东西来初始化它。
谢谢!
编辑 2016 年 5 月 9 日:添加了 "GetInfo",如 Leadtools 所示:
//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 returns -2041,表明未加载 LTFIL。
如果开始时整个文件都在内存中,则应使用 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
LEADTOOLS 支持人员给我的功能是正确的,但我仍然遇到这个问题,因为我正在链接到 Leadtools C++ class 库的 Unicode 和 ANSI 版本(Ltwvc_x.lib 和Ltwvc_ax.lib)。当我删除 Unicode 库(从我的 ANSI 项目中)时,一切正常。