如何使用LEADTOOLS 19将图像效果应用于内存缓冲区中的JPEG
How to apply image effects to a JPEG in a memory buffer using LEADTOOLS 19
我正在制作一个Windows可执行文件,使用C++、LEADTOOLS19和VS2015从服务器读取图像,使用LEADTOOLS对其应用图像效果,并在浏览器中显示。
服务器将图像作为一个字符数组提供给我,其中包含图像的JPEG编码(以"ïystïà"开头)和该缓冲区的长度。大多数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,但仍然得到相同的错误。
我觉得我需要做一些其他的事情来"准备"要加载的位图,但我不知道它的大小或其他任何事情来初始化它。
谢谢!
2016年9月5日编辑:添加了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未加载。
如果开始时整个文件都在内存中,则应该使用LMemoryFile::GetInfo和LMemoryFile::LoadMemory。如果你不这样做,那么FeedLoad就是最好的选择。这里有一个例子:https://www.leadtools.com/help/leadtools/v19/main/clib/lfile__startfeedload.html
您可以在LEADTOOLS安装文件夹中找到完整的工作示例:C:\LEADTOOLS19\Examples\ClassLibrary\MSVC\FeedLoad
LEADTOOLS支持给我的函数是正确的,但我仍然遇到这个问题,因为我链接到了LEADTOOLS C++类库的Unicode和ANSI版本(Ltwvc_x.lib和Ltwvc_ax.lib)。当我从ANSI项目中删除Unicode库时,一切都很好。
- 使用 fopen 打开 .pak 文件并使该文件应用于 const 无符号字符* (C++)
- 使用 std::应用于 std::bind
- 如何将Affine3d应用于Vector3d
- 运算符 += 应用于 std::valarray<int*>
- 函数可以应用于 std::optional,并返回一个可选值吗?
- 将基本类型数组中的内存重新用于不同(但仍然是基本)类型的数组合法吗
- 为什么带有类型参数的运算符 () 可以应用于 result_of 上下文中的类型?
- 当正斜杠运算符应用于C++中的字符串类型时,它会做什么
- 将MFPKEY_ASFMEDIASINK_AUTOADJUST_BITRATE应用于IMFSinkWriter
- (C++)(Visual Studio) 将高斯模糊滤镜应用于 RGB 中的灰度图像
- 在运行时将更改的环境变量应用于 QApplication
- Strcmp 类行为应用于C++中的对象列表
- 如何将 ItemDelegate 设置为仅应用于 QTreeView 中的父列
- 什么是应用于C 和CMAKE的定义
- 将对象方法从向量应用于C 的第二个向量中的对象
- STL:将功能应用于Adchacent_difference的结果,而无需额外的容器
- WXWIDGETS应用于WXStaticBitMap时,屏幕截图将大部分图像留为空白
- 如何将垂直纹理应用于QT Surface3D
- 如何将[[nodiscard]]属性应用于lambda
- 奇怪的语法构造 - 应用于 typedef 的运算符 () 使用 VS2015 成功编译