procedure TAddForm.ClearCanvas;  //清空画布
begin
  with Image1.Canvas do
  begin
    Brush.Style := bsSolid;
    Brush.Color :=$00800040;
    Image1.Canvas.FillRect(ClientRect);
  end;
end;procedure TAddForm.drawCanvas(filename: string; Image1:TImage); //读入图象
var
Jpg:TJPEGImage;
Bmp:TBitmap;
Iwidth,Iheight,Itop,Ileft:integer;
begin
bmp:=TBitmap.Create;
if uppercase(extractfileext(FileName))='.JPG' then
      begin
        Jpg:=TjpegImage.Create;
        Jpg.LoadFromFile(FileName);
        bmp.Assign(Jpg);
        jpg.free;
      end
else begin
bmp.LoadFromFile(FileName);
end;
if bmp.Width<Bmp.Height then begin
   Iwidth:=trunc(Image1.Height*bmp.Width/bmp.Height);
   ILeft:=Trunc(Image1.Width/2-Iwidth/2);
   image1.canvas.stretchdraw(Rect(Ileft,0,
              Iwidth+Ileft,Image1.Height),bmp);
end
else begin
   Iheight:=Trunc(Image1.Width*bmp.Height/bmp.Width);
   ITop:=Trunc(Image1.Height/2-Iheight/2);
   image1.canvas.stretchdraw(Rect(0,Itop,
              Image1.Width,Iheight+Itop),bmp);
end;
bmp.free;
end;procedure TAddForm.Button1Click(Sender: TObject);
begin
if Edit1.Text<>'' then
begin
   main.ADOTable.Active:=true;
   main.ADOTable.Insert;
   main.ADOTable.FieldByName('照片').assign(image1.Picture;);
   main.ADOTable.post;
   main.ADOTable.Active:=false;
   Application.messagebox('记录保存成功!','提示' ,MB_OK+MB_APPLMODAL);
   clearCanvas;
   DrawCanvas('defalt.jpg',Image1);
end
else begin
  Application.messagebox('姓名必须输入!','注意' ,MB_OK+MB_APPLMODAL);
  Edit1.SetFocus;
end;
end;

解决方案 »

  1.   

    1 你用的什么数据库? 本地的还是远程的?
    2 你用的是同一副图片进行测试的吗? 即是否可以排除是由于图片太大而引起的?
    3 你说的变花是什么症状?是bmp还是jpg的时候发生的? 是半个画面正常半个变花还是
       全部变花?
    4 再确认一下是写入的时候不正常还是都出的时候出现问题? 可以用其他工具看一下
      写入的图形大小是否正确? 同一副图片第一次和第二次在库里的大小是否已经不一样了?
      最好用数据库自己带的浏览工具来查看。
      

  2.   

    我先问一下你的机器有没超频。如有,可能就是问题所在。你试试调回来。
    如没有,在“main.ADOTable.post;”后面加一句,
          main.ADOTable.Fl...;//tadotable的一个方法,全写不记得了,作用是释放它的所有缓冲区。
      如成功,告知我。
      

  3.   

    1,我用的是ACCESS2000本地
    2,同一副图我试过,也是第一次完好无缺,以后都不行
    3,变花就好象是图片在16色状态下显示一样,是全部变花!
    4,应该是写入不正常,因为第一次读入的图,以后读出时都是正常的!
       大小,我现在就去测试!
      

  4.   

    我曾经在BCB遇到过失真的情况。
    你可参考一下:http://www.csdn.net/expert/topic/112/112660.shtm
    我的结论是只要在jpeg存盘前Bitmap没有存盘的语句,生成的图像就正确,只要在jpeg存盘前加入了类似Bitmap1->SaveToFile ("d:\\www.bmp");这样的语句,jpeg存的文件就失真。
    你也试试,如果有什么新的发现,请贴出来。
      

  5.   

    释放所有缓冲区!
    这么多,我不知道用哪个啊!
    不会是
    ADOTable.FreeInstance吧?
      

  6.   

    TADOTable的一个Fl开头的方法。全写不记得了。
      

  7.   

    没有FL开头的方法(我用的是DELPHI6,不知道是不是被去掉了!)
      

  8.   

    可我都是存bitmap的啊,即使读取的是JPEG我也转到bitmap再填到画布上
    image1.canvas.stretchdraw(Rect(),bmp);然后再存入库中
      

  9.   

    我发现一个新问题! mid:=Tpicture.Create;
     mid:=image1.Picture;
    ...
    main.ADOTable.FieldByName('照片').assign(mid);
    ...
    post;
    mid.free;  //这句程序运行是本身没错,但这段程序运行完后就报一个application错误!
    ...
    mid用过后free居然会报错,错误信息与ACCESS有关,不用free就一点事也没有!
      

  10.   

    你有没有搞错?
    mid:=Tpicture.Create;
    mid:=image1.Picture;
    ?????
    怎么会这样写呢? 不出错才怪!var
    mid:Tpicture;
    begin
    mid:=image1.Picture;
    ...
    main.ADOTable.FieldByName('照片').assign(mid);
    ...
    post;...
    end;不需要Create,如果一个对象Create了,就不可以被随便赋值,否则Free的时候出错就是后果了
      

  11.   

    不错才怪,
    mid:=Tpicture.Create;
    mid:=image1.Picture;
    怎么可以怎么写的? 你把mid对应的对象指针覆盖了,free当然出错了,
    把free和create两句话都去掉试试
      

  12.   

    在存储新图之前执行如下过程,保管没问题
    procedure clearbitmap(bit:tbitmap);
    begin
    bit.width:=0;
    bit.height:=0;
    end;
      

  13.   

    好象不对啊,我去掉mid:=Tpicture.Create;还是要报错的!
    是不是MID:=IMAGE1。PICTURE这句并没有把IMAGE。PICTURE的值赋予MID,而是把MID指向
    IMAGE1。PICTURE,然后在FREE的时候就把IMAGE1。PICTURE给FREE了!我也不大清楚!
      

  14.   


     贊成 flypuma 的觀點﹐非標准數據類型一定要用 assign 賦值!
      

  15.   

    哈哈,问题解决了,
    改成
    mid:=Tpicture.Create;
    mid.Assign(Image1.Picture);

    main.ADOTable.FieldByName('照片').assign(mid);

    就行了!   所有图象全都正常了!!!可我还是不知道为什么,   为什么直接用
    main.ADOTable.FieldByName('照片').assign(Image1.Picture);
    就不行,而一定要用一个TPICTURE在中间传递???谁能告诉我!!!???
      

  16.   

    "是不是MID:=IMAGE1。PICTURE这句并没有把IMAGE。PICTURE的值赋予MID,而是把MID指向
    IMAGE1。PICTURE,然后在FREE的时候就把IMAGE1。PICTURE给FREE了!我也不大清楚!"说得完全正确!