Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/delphi/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Image 如何优化图像解码的Delphi代码?_Image_Delphi_Image Processing - Fatal编程技术网

Image 如何优化图像解码的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

我对图像进行了编码,并希望在我的程序中对其进行解码。图像解码基于以下答案:图像文件以流的形式加载、解码、转换为MemoryStream,然后通过从MemoryStream加载。Delphi代码如下所示:

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;
如您所见,我使用了两个内存缓冲区:bufTMemoryStream。如何优化此代码以避免双重内存使用

  • 将编码后的图像读入内存流,而不是
    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'
    。非常感谢。