我把一幅照片保存在 Image1 控件中,打算通过下面的遍历算法把 Image1中的像素复制到另外一个控件 Image2 中。但Delphi不支持下面的算法:for i:=0 to 100 do
begin
  for j:=0 to 100 do
    c := Image1.Canvas.Pixels[i,j];
... ...理由是:"Can only modify an image if it comtains a bitmap"。是否有适当的办法解决上述问题?

解决方案 »

  1.   

    c是什么啊?
    1 你直接用BitBlt不就行了,因为BitBlt很可能被是被显卡厂商优化过,所以速度也更快
    2 先对tbitmap赋值,然后再连接到image2上
      

  2.   

    1 如果你只是想实现复制图片的功能,直接用BitBlt,看看msdn吧,或者用delphi中的copy ,loadfrom...方法都可以
    2 如果你是想知道这么处理和颜色转化,我还不太明白你的意思.
      

  3.   

    firetoucher(风焱):取出像素的颜色是一个必要的步骤,但我找不到可行的方法。
      

  4.   

    定义一个TColor类型 的变量,颜色用上面的函数就可以取出了。但要记住图像Width 是从0到Width -1 个,不要越界哟。 闷ing!
      

  5.   

    定义c为TColor类型的变量就可以取出了。TColor可以与DWord类型 互换.使用时注意不要越了图像的Width , Height 边界就可以了。
      

  6.   

    Image2.picture.Assign(Image1.Picture);
      

  7.   

    如果你不需要对各个像素点进行处理,干吗复制到image2中用这种方法?直接copy过去不就完了,如果你需要对像素点处理,那就先用个2维数组存入各个像素点的RGB值,可以指定范围的处理咯!
      

  8.   

    首先楼主应该补习英文,错误已经说的很明白了~~~"...if it contains a bitmap",很明显你Image里导入的不是BMP位图,JPEG,或者是...?或者看看封装TImage的VCL代码~~~Image.Canvas实质是对Image.Picture.Bitmap进行操作当Picture.Graphic <> nil,而Picture.Graphic is TBitmap不成立的时候就会抛出上面的异常另外还需明白这里的Canvas.Pixels[i,j]的实质是是调用API GetPixel,这个API的效率是非常低的,做图像处理就不用考虑它啦!直接从内存中获取位图颜色信息,如利用TBitmap的成员ScanLine获取每行的首地址,再根据色深不同加以转化~~~
      

  9.   

    http://www.51delphi.com/delphi/tlsearch?str=图形&no=1&lb=title
      

  10.   

    http://www.51delphi.com/delphi/tlsearch?str=图形&no=2&lb=title