将一系列坐标(已保存到数据库)以MM_HIENGLISH模式在Image上画出了各坐标点,并将Image保存为了BMP格式;
在程序另一个地方读出该图,并按照已知点的坐标读出BMP图上相应位置(显示包含该坐标的一小块图);
  with Dm.tbCAD do begin
    Locate('ID', TComboBox(Sender).Text, []);
    Edit;
    if (not VarIsNull(Fields[1].AsFloat)and not VarIsNull(Fields[2].AsFloat)) then begin
      p.X := (Round(1000*Fields[1].AsFloat));//*1000是数据库中保存的是实际值,现放大1000倍
      p.Y := (Round(1000*Fields[2].AsFloat));
    end;
  end;  //取拷贝的正方形大小为1X1英寸
    R := Rect(p.X-500, p.Y+500, p.X+500, p.Y-500);
    imgView.Canvas.CopyRect(imgView.ClientRect, BMP.Canvas, R);参数说明:BMP是上面说的保存的图像;ImgView是显示拷贝图像的Image;R为TRect现在的问题是:通过这种方式拷的图像块坐标位置有问题,有偏移。
比如说:P的坐标为(1308, -1614),我想在BMP图像上的P坐标位置一个1X1英寸的框,那么拷出来的图的中心就应该是P坐标位置。但实际看到的有偏移。通过分析,其实主要问题是:CopyRect的参数可不可以用英寸,还是只能用象素?有没有哪位了解?

解决方案 »

  1.   

    MM_HIENGLISH 每点对应0.001英寸   Each logical unit is converted to 0.001 inch. Positive x is to the right; positive y is up.
    MM_HIMETRIC 每点对应0.001毫米   Each logical unit is converted to 0.01 millimeter. Positive x is to the right; positive y is up.
    MM_LOENGLISH 每点对应0.01英寸   Each logical unit is converted to 0.01 inch. Positive x is to the right; positive y is up.
    MM_LOMETRIC 每点对应0.001毫米   Each logical unit is converted to 0.1 millimeter. Positive x is to the right; positive y is up.
    MM_TEXT 象素对应   Each logical unit is converted to 1 device pixel. Positive x is to the right; positive y is down.
    以上几种映射默认的原点在屏幕左上方。除MM_TEXT外都为X坐标向右增加,Y坐标向上增加,和自然坐标是一致的。所以在作图是要注意什么时候应该使用负坐标。而且以上的映射都是X-Y等比例的,即相同的长度在X,Y轴上显示的长度都是相同的。
    CopyRect的参数应该只能是象素,自己转换一下
      

  2.   

    aloking(黑鲸) :这些东东我知道,因为保存到数据库里的是英寸,而且我读出以英寸单位画的图,但转成象素后,在那张图上去描点,却产生了偏移;例如:
       P(点在图像的实际位置)
                 P'(转成象素后点的位置)所以我也搞晕了,为什么产生了这么大的偏移。
      

  3.   

    帮楼主顶,另外感叹aloking(黑鲸) 的强大
      

  4.   

    我都直接保存的象素点的位置的
    zsuswy(羊) ( ) 
    这些东西,google一下就有了:)
      

  5.   

    aloking(黑鲸):
      是可以保存象素值,但需要将英寸转为象素,但这样来说精度就有变化,导致图像画出来不精确,产生了一些棱角。
      

  6.   

    你本身的那段取坐标的东西
    用到了round难免会出现这种情况