Image 如何优化图像解码的Delphi代码?
我对图像进行了编码,并希望在我的程序中对其进行解码。图像解码基于以下答案:图像文件以流的形式加载、解码、转换为MemoryStream,然后通过从MemoryStream加载。Delphi代码如下所示:Image 如何优化图像解码的Delphi代码?,image,delphi,image-processing,Image,Delphi,Image Processing,我对图像进行了编码,并希望在我的程序中对其进行解码。图像解码基于以下答案:图像文件以流的形式加载、解码、转换为MemoryStream,然后通过从MemoryStream加载。Delphi代码如下所示: function loadEncodedImage(filename, keycode : string) : TBitmap; syn : TSynPicture; fs : TFileStream; ms : TMemoryStream; buf : AnsiString
function loadEncodedImage(filename, keycode : string) : TBitmap;
syn : TSynPicture;
fs : TFileStream;
ms : TMemoryStream;
buf : AnsiString;
begin
result := nil;
try
fs := TFileStream.Create(filename, fmOpenRead);
SetLength( buf, fs.Size );
fs.ReadBuffer( buf[1], fs.Size );
// ....
// Here I decode data stored in buf and put it into buf again.
// ....
ms := TMemoryStream.Create();
ms.SetSize( fs.Size );
ms.WriteBuffer( buf[1], fs.Size );
syn := TSynPicture.Create();
syn.LoadFromStream( ms );
result := syn.ToBitmap;
finally
FreeAndNil( fs );
FreeAndNil( syn );
end;
end;
如您所见,我使用了两个内存缓冲区:buf和TMemoryStream。如何优化此代码以避免双重内存使用
AnsiString
。一想到要用ansisting
,请允许我说“嗯”李>
内存属性访问缓冲区
TByteStream
可能是一个更好的选择。这使您能够更自然地对缓冲区进行面向字节的访问
不管它值多少钱,我预计您将无法测量通过删除额外内存拷贝而获得的性能差异
TMemoryStream
有一个内存
成员,允许直接访问内存块。通过这种方式,您可以完全消除buf
为什么buf
类型为ansisting
?因为我在解码过程中使用这种类型。我需要字节数组。您可以建议使用哪种类型?如果您需要一个字节数组,那么一个字节数组就可以了。;-)如果出于某种原因您不喜欢字节数组,也可以使用TBytes
。我回滚了您的编辑。没有必要重复你在问题中得到的答案。你需要更多的帮助吗?@David不,谢谢!内存是指向内存的指针。您不想更改内存
,您想更改内存^
,或者在您的情况下可能是pbyteraray(内存)^
。注意^
。像这样内存^[234]
?是的。您只需记住,指针指的是TMemoryStream
分配的内存。可以像David Heffernan那样将文件直接加载到TMemoryStream。要更改存储在内存中的数据
我需要使用类似这样的方法:PByteArray(内存)^[k]
?@ivan我建议的方法与jensh完全相同该属性是只读的。但该属性返回指向内存的指针。您可以通过该指针访问它们的内存。如果需要获取第n个字节,是否需要使用以下代码:pbyteraray(memory)^[n]
?可以。或者启用POINTERMATH并强制转换到PByte:PByte(ms.Memory)[i]我使用Delphi7,这里不允许使用POINTERMATH。这个代码是工作:(PAnsiChar(ms.Memory)+i)^:='x'
。非常感谢。