Var
  MS: TFileStream;
  mem: TMemoryStream;
  Http: TIdHTTP;
  rs:string;
Begin
  Http := TIdHTTP.Create(self);
  mem := TMemoryStream.Create;
  try
  Http.Get(Edit2.Text,mem);//获取URL的图片到流
  except
      Showmessage('网络出错!');
      mem.Free;
      Exit;
  end;
  Image1.Picture.Graphic.LoadFromStream(mem);
  mem.Free;
  Http.Free;
End;Edit2.Text:='http://8ahsdv.5166.info/controls/ImgText.ashx?c=+PfPglYdwJyG/LMWS2YsKA==';此为获取网站验证图片的URL
用浏览器出来的图片确实是bmp位图,而程序的Image1根本没有任何图片显示。
如把流保存到bmp图片(mem.SaveToFile(ExtractFilePath(ParamStr(0))+'\test.bmp')后,再用文件流打开此图片时(MS:=TFileStream.Create(ExtractFilePath(ParamStr(0))+'\test.bmp', fmOpenRead);Image1.Picture.Graphic.LoadFromStream(mem);),则会出现出错信息是为bitmap image is not valid。而用acdsee看此图则可以看到。如何解决,我觉得获取的图片不是纯bmp图,可能前面一些字节有干扰的信息,因此出错。请高手指教!

解决方案 »

  1.   

    Image1.Picture.Graphic.LoadFromStream(mem);
    不要那个Graphic了嘛。
    直接Image1.Picture.LoadFromStream(mem);
      

  2.   

    有一种可能性就是TImage不支持这个图片格式。找个合适的控件就能解决这个问题。
      

  3.   

    可是我直接用ie浏览此图片后保存成bmp文件,然后用TImage打开此保存的图片,就一点问题都没有,但是用mem.SaveToFile(ExtractFilePath(ParamStr(0))+'\test.bmp'保存图片后缺打开失败。我想是不是要加上bmp的文件头信息啊?
      

  4.   

    1,idhttp.HandleRedirects需要设置成为true,否则你得来的东西是一段html代码。这应该存在一个页面跳转的过程。
    2,这张图片实际上JFIF的,也是jpeg的一类。你用浏览器保存后看到的是经过转化的,但是idhttp是不会给你转化的。
    jfif图片存储格式之一,由JPEG格式衍生而来,后缀为".jfif"。
      JPEG本身只有描述如何将一个图像转换为字节的数据串流(streaming),但并没有说明这些字节如何在任何特定的储存媒体上被封存起来。一个由独立JPEG小组(Independent JPEG Group)所建立的额外标准,称为JFIF(JPEG File Interchange Format,JPEG档案交换格式),详细说明如何从一个JPEG串流,产出一个适合于电脑储存和传输(像是在因特网上)的档案。当有人称呼一个"JPEG档案",一般而言他是意指一个JFIF档案,或有时候是一个Exif JPEG档案。然而,也有其他以JPEG为基础的档案格式,像是JNG。 
      JPEG/JFIF是最普遍在万维网(World Wide Web)上被用来储存和传输图片的格式。它并不适合于线条绘图(drawing)和其他文字或图示(iconic)的图形,因为它的压缩方法用在这些图形的型态上,会得到不适当的结果(PNG和GIF格式通常是用来针对这种目的之图形;GIF每一像素只有8位元,并不很适合于用在彩色照片,PNG可以被用来无失真地储存照片,但是档案太大让它不适合在网页上放照片)。
      对于JFIF的MIME媒体型态是image/jpeg(定义在RFC 1341)。 
      

  5.   

      mem.Position :=0;//加了这个就行了!
      jpg.LoadFromStream(mem);
    原来是这个问题!多谢lcgboy 的详细指导!再想问问lcgboy :idhttp.HandleRedirects需要设置成为true有咩用啊?
      

  6.   

    页面存在跳转,如果不设置成true,idhttp只会读取第一次请求的页面。