var
  pt:TPoint;
  i,k:integer;
begin
  for i := 0 to image1.Width - 1 do
    for k := 0 to image1.Height - 1 do
    begin
      pt.X := i; pt.Y := i;
      pt := image1.ClientToScreen(pt);
      result := GetPixel(GetDC(0), pt.x, pt.Y); //得到屏幕上某点的颜色
    end;循环取屏幕上某点的颜色值,如果图片较小的话,就没问题。
稍大一点的图片,到后面得到的颜色值都变成黑色了?
这是什么原因呢,怎么解决?

解决方案 »

  1.   

    你要把循环截取的屏幕点的颜色放在一个和图像一样大的2维数组:   result[0..width-1,0..height-1]中,而不能放在一个result中,否则你得到的,只是图像最后一个像素的颜色.
      

  2.   

    to zzwu(未名):
    这个我知道,我只是写个例子var
      pt:TPoint;
      i,k:integer;
      cl:TColor;
    begin
      for i := 0 to image1.Width - 1 do
        for k := 0 to image1.Height - 1 do
        begin
          pt.X := i; pt.Y := i;
          pt := image1.ClientToScreen(pt);
          cl := GetPixel(GetDC(0), pt.x, pt.Y); //得到屏幕上某点的颜色
          //在这里我根据cl给另一个canvas对应点赋颜色值,但发现图片较大时,到后来取到的
          //cl都是$FFFFFFF,也就是黑色
        end;
      

  3.   

    原因是image1.Width与image1.Height没有设置正确
      

  4.   

    呵呵,自己搞定了
    var
      pt:TPoint;
      i,k:integer;
      cl:TColor;
      DC:HDC;
    begin
      for i := 0 to image1.Width - 1 do
        for k := 0 to image1.Height - 1 do
        begin
          pt.X := i; pt.Y := i;
          pt := image1.ClientToScreen(pt);
          DC := GetDC(0);
          try 
            cl := GetPixel(DC, pt.x, pt.Y); //得到屏幕上某点的颜色
            //在这里我根据cl给另一个canvas对应点赋颜色值
          finally
            ReleaseDC(0,Dc); // 要在这里释放
          end;
        end;
    //这样就OK了