【问题标题】:How can I load a jpeg image from a buffer?如何从缓冲区加载 jpeg 图像?
【发布时间】:2022-01-26 01:50:17
【问题描述】:

我想将 jpeg 图像存储在 RC_DATA 资源中,而不是将单个图像存储在单个 RC_DATA 中。 RC_DATA 中有很多东西,都混合在一起。在运行时,我将 RC_DATA 加载到缓冲区中并提取所有对象,包括这个 Jpeg。现在我在内存缓冲区中有这个图像,我需要将它加载到 TJpegImage 或 TBitmap 中。我怎样才能做到这一点 ?我看到那些类没有一些方法来实现这一点......

【问题讨论】:

  • TJPEGImage.LoadFromStream来说似乎是一份完美的工作。
  • 我非常怀疑你 multiplexed 数据流。很可能你只是concatenated他们。你的buffers
  • 给每张图片一个不同的id
  • @DavidHeffernan 确实如此,这样会很简单,但我不希望任何人使用资源编辑器并提取该图像。
  • @MarusNebunu:他们仍然可以使用资源编辑器来提取您的图像。

标签: delphi resources jpeg delphi-10.3-rio


【解决方案1】:

将 JPEG 字节从缓冲区复制到 TMemoryStream(或者,使用 TCustomMemoryStream 直接指向 JPEG 字节以避免复制)。然后你可以将该流传递给TJPEGImage.LoadFromStream()

【讨论】:

  • 但是如果我使用TCustomMemoryStream,我必须从中创建一个新类并覆盖SetPointer 过程?因为我看到它是受保护的,我无法按原样访问它......嗯,它似乎不能被覆盖,因为它不是虚拟过程。
  • @MarcusNebunu 不,SetPointer() 不是虚拟的,所以你不能覆盖它。您将创建一个调用 SetPointer() 的新类,例如在构造函数中,例如:type TMemBufferStream = class(TCustomMemoryStream) public constructor Create(ABuffer: Pointer; ASize: NativeInt); end; ... constructor TMemBufferStream.Create(ABuffer: Pointer; ASize: NativeInt); begin inherited SetPointer(ABuffer, ASize); end;
猜你喜欢
  • 2013-01-21
  • 2019-02-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-08-18
  • 1970-01-01
  • 1970-01-01
  • 2011-02-22
相关资源
最近更新 更多