存入数据库是通过 MemoryStream的,即网上最常见的方法。存入BITMAP,JPEG都没发现失真,但存入TICON就有失真的现象。我自己测试了下,发现在将TICON写入流时就出现了失真情况。测试代码如下:
procedure TForm1.Button1Click(Sender: TObject);
var
  ms: TMemoryStream;
  icon: TIcon;
begin
  if not Assigned(Image1.Picture.Graphic) then
    Exit;
  ms:= TMemoryStream.Create;
  Image1.Picture.Graphic.SaveToStream(ms);  icon:= TIcon.Create;
  ms.Position:= 0;
  icon.LoadFromStream(ms);
  Image2.Picture.Assign(icon);
  icon.Free;
end;上面只对ICON做了一次stream转换,但转换后读取出来就出现失真现象了,我不知道是不是和图标文件有关(如图标文件的色彩等)。请教下应该如何解决。

解决方案 »

  1.   

    把graphic换成icon试试:
    给个例子给你
    var
      mm : TMemoryStream;
    begin
      mm := TMemoryStream.Create;
      Image1.Picture.Icon.SaveToStream(mm);
      mm.Seek(0,0);
      Image2.Picture.Icon.LoadFromStream(mm);
      mm.Clear;
      mm.Free;
    end;
      

  2.   

    回答 charles1975(zouxu): Graphic换成Icon是一样的。
    --------------
    回答 jjwwang(风归叶):没试过,而且我要应用到的地方也不可能去这么转一下的。
    我下午又测试了下,可能是图标包涵的颜色数量引起的,并不是所有图标都会引起失真现象(可能是所有图标都会有失真,但某些图标比较明显,而有些又不明显)我打开了2个图标。都用 PrinttScreen 按键截取屏幕,然后通过“附件->画图”保存成24位位图和16色 位图, 1个图标看不出什么失真情况(或许实际上存在,但并不明显),另一个就相当明显的发生了失真现象。
      

  3.   

    已经找到另一个方法了,24位色的图标通过stream转确实会出现失真情况,但通过bitmap中转就不会失真。
    即: 
    存数据库:Icon --> 转成Bitmap --> 写入stream --> 存入数据库。
    从数据库读取: --> 读入stream --> Bitmap转成Icon