2013-03-10 62 views
2

我尝试每一次我都加载PNG到的TImage

Image1.Picture.LoadFromFile('c:\c.png'); 

我得到一个PNG图像加载到使用PNGImage库的TImage,

正在读取的文件不是有效的“便携式网络图形”图像 ,因为它包含无效的标头。该文件可能已损坏,尝试 再次获得它

现在,我想这个问题是由这些线(从PngImage库)引起的:

{Characters for the header} 
const 
    PngHeader: Array[0..7] of Char = (#137, #80, #78, #71, #13, #10, #26, #10); 

{Loads the image from a stream of data} 
procedure TPngObject.LoadFromStream(Stream: TStream); 
var 
    Header : Array[0..7] of Char; 
    HasIDAT : Boolean; 

    {Chunks reading} 
    ChunkCount : Cardinal; 
    ChunkLength: Cardinal; 
    ChunkName : TChunkName; 
begin 
    {Initialize before start loading chunks} 
    ChunkCount := 0; 
    ClearChunks(); 
    {Reads the header} 
    Stream.Read(Header[0], 8); 

    {Test if the header matches} 
    if Header <> PngHeader then 
    begin 
    RaiseError(EPNGInvalidFileHeader, EPNGInvalidFileHeaderText); 
    Exit; 
    end; 

我试图改变字符到ANSIChar一致,但它没有工作。

+0

我很想自己调查此PNG文件。你能否让它可用? – 2013-03-10 11:23:57

+0

您的意思是图片im loading?这里:http://google.uci.edu/images/googleicon.png – 2013-03-10 11:24:51

+0

哪个版本的Delphi? – 2013-03-10 11:25:23

回答

7

您正在自己编译PNGImage单元,并且您已经为预编码的Delphi设计过时的PNGImage。这是你的根本问题。

PNG功能现在嵌入到Delphi中。 PNGImage单元是随产品一起提供的标准库的一部分。只需删除您的PNGImage代码版本即可。确保您删除了.pas和.dcu文件,以便您的错误版本无法使用。

然后在你的一个单元中的一个uses子句中包含PNGImage,我猜你已经这么做了。这将导致正在使用的单元的内置版本。

+0

嗯,我试图删除pngimage.pas,我不能编译了,我得到“无法解析单位名称”pngimage“...”我如何恢复内置的 – 2013-03-10 11:36:10

+2

@yassine_hell:我不敢问......你的意思是你真的删除了你正在使用的'pngimage'的唯一副本,现在正在询问如何取消删除它? – 2013-03-10 12:30:21

+0

xD idk我做了什么,但我修复了它,现在它的后面:D – 2013-03-10 12:33:04