如何把image.canvas上的线全擦掉(不用异或和多图层)
多图层,鼠标滚动不好实现
异或,因为image显示了一张图,异或画的线颜色不对

解决方案 »

  1.   

    前提是你没有把线和 这个图混为一体,看你怎么管理的了.显示的地方当然是 线实实在在的和图在一起.如果你找不到这个线了。那么,你也别想在高效的抹掉它.你的线对象应该是被串到一个TOjectList的链表中的吧?
    你的刷新全部 的代码可能是这个样子: for i:=0 to YourObjectList.Count-1 do
       TObject(YourObjectList[i]).Paint;
    .............
    要所有的线都不出现的话(隐藏或者被删除),那么在刷新代码中判断是不是你的线类,是的话,不要执行线类的刷新代码就是了.要不染,直接从List中DELETE掉所有的线类,在全部刷新就完了。
      

  2.   

    再load一个空白图,原来的不就没了么,相当于全部擦掉了
      

  3.   

    image.repaint没用没办法再load一个空白图我现在用2个image一个显示图片,一个用来画线,效果实现了,但有个问题,当我用鼠标滚轮滚动时,image2明显的延时,有什么办法让image1和iamge2一起滚动?
    我让图片滚动用的是ScrollBox+2个image
    procedure TMDIChild.ScrollBox1MouseWheel(Sender: TObject;
      Shift: TShiftState; WheelDelta: Integer; MousePos: TPoint;
      var Handled: Boolean);
    begin
      if WheelDelta < 0 then
        ScrollBox1.Perform(WM_VSCROLL, SB_LINEDOWN, 0)
      else
        ScrollBox1.Perform(WM_VSCROLL, SB_LINEUP, 0);
    end;
      

  4.   

    为什么要滚动两个图呢?为什么不把他们画到一个图上在滚动一个图呢?我本来画在一个图上,但无法擦除canvas上的线条啊,只好出此下策背景图颜色很复杂,根本无法提取,异或画的线颜色又不对,我没辙了
      

  5.   

    那就试试image1.Canvas.Refresh;repaint,refresh都不用想了,肯定不行
      

  6.   

    image1.Canvas.Refresh;
    这个不行么
      

  7.   

    image1.Canvas.Refresh;
    这个不行么这个要管用我就不来这问了
      

  8.   

    由于采用的mdi模式,所以无论是bitmap备份还是记录画线坐标,都会出现问题,我就想知道有什么办法可以轻松的擦除image.canvas上的线条
      

  9.   

    用ImageEn2.13吧,网上有下载!
      

  10.   

    这和MDI有关系?我不认为会出现任何问题Image.Canvas就是对位图进行操作,破坏了位图怎么可能回去?
      

  11.   

    image.picture:=nil;
    清空image的所有图像。
      

  12.   

    那能不能这样,在图片后面再把图像本身复制一边,前面的显示,进行操作,后面的作为源图的备份,恢复时用?我试了一下,用流的方式修改文件,导入到image显示,iamge会自动根据bmp文件头判断文件大小,后面加的部分image好象就不要了,这怎么办?
      

  13.   

    我今天也是为这个问题而捆饶用REPAINT不行FREE之后再创建可以
    但是提示读取内存错误!我用的是两个IMAGE解决的不知道有没有更好的方式
      

  14.   

    image.picture:=nil;
    可以清空但是在paint里的却无法清空的掉你可以考虑这个窗体输出空白字符那样可以就是比较费时我测试了一下大概1秒钟
      

  15.   

    画每条线的同时用copyrect保存底图被线覆盖的部分,清楚线只要用保存下来的那部分底图覆盖回去,如果是不规则的可能要用RGN了。
      

  16.   

    太麻烦,强烈建议你按照楼上某位仁兄说的,把数据和视图分开。也就是说你在内存中建立一个完整图片的备份,然后把它和其他的线条画到一个Image控件上。否则没有任何的办法来完全恢复原图像。不要担心内存空间,你所为此多付出的空间只是屏幕视图区的图像空间,它多数情况下是小于等于图像本身大小的。你可以想象一个极端的情况,当你的线条太多把所有的图像都遮住的时候,除非重新从硬盘上读,否则是没有办法恢复图像的。如果你用楼上说的实现存储图像部分的话,那么你用的存储空间比图像占用的空间还要大。