在Picturebox.image上绘制图形或者图片出现偏移,位置不准确

Groves_Lin 2015-06-18 03:00:04
做了一个winform的图片浏览器,放入了splitContainer,在panel1中加入了picturebox,然后通过picturebox的事件MOVE,CLICK,UP,DOUWN, MOUSEwHILE,用两种方法实现了图片的放大,缩小,拖动,(针对picturebox控件和picturebox.image进行的),当图片大小大于picturebox时,图像显示不完,如果在不拖动的情况下,要想看不到的区域作图,就需要拖动图片作图,但是作图(bitmap)后发现画上去的线或者图片与自己想要画的位置出现了偏移,估计是坐标系不同,导致在鼠标down的时候取到的位置并不是图片上的x,y,而是工作区中的x,和y,现在不知道该怎么做了,请各位高手指点!!!!
...全文
996 21 打赏 收藏 转发到动态 举报
写回复
用AI写文章
21 条回复
切换为时间正序
请发表友善的回复…
发表回复
O_OQAQ 2015-06-22
  • 打赏
  • 举报
回复
试试减去picturebox的location.x和location.y
JavaLiCong 2015-06-22
  • 打赏
  • 举报
回复
不要使用picturebox,使用panel自定义控件自定义,进行无刷新重绘,利用绘制坐标,图片与控件显示比例,鼠标点击坐标等,计算对应图片上的坐标
猴头 2015-06-19
  • 打赏
  • 举报
回复
我这看看,这个我当时也没计算出来,不知道如何计算偏差,当时我遇到的问题是计算滚动条便宜位置的,后来作罢了 你琢磨出来算法了之后,@我一下,让我也学习学习
Groves_Lin 2015-06-18
  • 打赏
  • 举报
回复
引用 15 楼 Z65443344 的回复:
bmpX/e.X=bmp.Width/pic.Width 等比公式 把e.X挪到等式右边去就计算出真实的坐标了
换算过后坐标的值都成负的了
Groves_Lin 2015-06-18
  • 打赏
  • 举报
回复
引用 15 楼 Z65443344 的回复:
bmpX/e.X=bmp.Width/pic.Width 等比公式 把e.X挪到等式右边去就计算出真实的坐标了
换算了也不对啊,再仔细看看?有没有类似的Demo之类的?
Groves_Lin 2015-06-18
  • 打赏
  • 举报
回复
引用 13 楼 Z65443344 的回复:
比如你的bmp大小是200*200 你的pic大小是50*50 那么点击(20,20)这个点,对应bmp并不是(20,20),而是(80,80) 这个应该能理解吧
理解当然理解了,换算过程在任何过程都要进行吗?还是只进行一次,比如,点击,缩放,拖拽?
於黾 2015-06-18
  • 打赏
  • 举报
回复
bmpX/e.X=bmp.Width/pic.Width 等比公式 把e.X挪到等式右边去就计算出真实的坐标了
xuzuning 2015-06-18
  • 打赏
  • 举报
回复
picturebox 在 panel 中 鼠标位置是参照 panel 的 当 panel 的滚动条被拖动后(假定向右 100 个像素)picturebox 的 left 将是 -100 这一点你打印出来看一下就知道了 所以画图时,要把鼠标位置折算的 picturebox,因为你是在 picturebox 中画图
於黾 2015-06-18
  • 打赏
  • 举报
回复
比如你的bmp大小是200*200 你的pic大小是50*50 那么点击(20,20)这个点,对应bmp并不是(20,20),而是(80,80) 这个应该能理解吧
於黾 2015-06-18
  • 打赏
  • 举报
回复
晕,看错了 你那是计算鼠标移动 现在的问题是,你获取了e.X和e.Y就直接把它当bmp的像素坐标了 但是picturebox本身就缩放过,和bmp已经不是同样的大小了 所以需要一个比例换算
於黾 2015-06-18
  • 打赏
  • 举报
回复
为啥要减去e.Location.X?? 既然是picturebox的点击事件,那就是picturebox的相对坐标,跟panel和form没有关系 你不要管picturebox相对于panel的坐标是啥
Groves_Lin 2015-06-18
  • 打赏
  • 举报
回复
引用 3 楼 Z65443344 的回复:
要么就别用bmp
而是在pic上直接作图

外面嵌套个panel,然后缩放pic
这样你获取的坐标就是准确的坐标了

我直接上代码:你帮我瞧瞧





於黾 2015-06-18
  • 打赏
  • 举报
回复
要么你用pic.width/bmp.width来算比例,然后根据比例,将坐标换算成bmp的坐标
於黾 2015-06-18
  • 打赏
  • 举报
回复
引用 7 楼 hxl199109 的回复:
[quote=引用 3 楼 Z65443344 的回复:] 要么就别用bmp 而是在pic上直接作图 外面嵌套个panel,然后缩放pic 这样你获取的坐标就是准确的坐标了
我就是在panel上放了一个picturebox,然后把panel置于底层的,然后对picturebox进行拖动,放大和缩小[/quote] 那么既然你已经放大缩小过了,放大缩小的比例你得用变量记住啊,不能直接赋值给控件拉倒了 否则怎么计算啊
Groves_Lin 2015-06-18
  • 打赏
  • 举报
回复
引用 3 楼 Z65443344 的回复:
要么就别用bmp 而是在pic上直接作图 外面嵌套个panel,然后缩放pic 这样你获取的坐标就是准确的坐标了
我就是在panel上放了一个picturebox,然后把panel置于底层的,然后对picturebox进行拖动,放大和缩小
於黾 2015-06-18
  • 打赏
  • 举报
回复
引用 5 楼 hxl199109 的回复:
[quote=引用 2 楼 Z65443344 的回复:] 你是如何将bmp在pic上偏移和缩放的,自己应该保留了参数吧 根据比例换算一下坐标啊 否则当然是只能获取到鼠标点击到pic上的坐标,编译器也没法知道你的pic和你后台的bmp是啥关系
我是直接把bmp画在了pic.image上的[/quote] 也就是说,偏移量,缩放比例,你自己都不知道,只不过是设置了pic的属性之后它就自动调整了? 那就没啥好办法了. 不行试试我说的方法,让pic不要缩放图片,而是根据图片实际大小显示 然后让pic在panel里移动位置 这样你点击pic的时候获取到的坐标就绝对是准确的坐标了
Groves_Lin 2015-06-18
  • 打赏
  • 举报
回复
引用 2 楼 Z65443344 的回复:
你是如何将bmp在pic上偏移和缩放的,自己应该保留了参数吧 根据比例换算一下坐标啊 否则当然是只能获取到鼠标点击到pic上的坐标,编译器也没法知道你的pic和你后台的bmp是啥关系
我是直接把bmp画在了pic.image上的
Groves_Lin 2015-06-18
  • 打赏
  • 举报
回复
引用 1 楼 pig357 的回复:
PointToClient()试试呢
这个方法已经试了,行不通
於黾 2015-06-18
  • 打赏
  • 举报
回复
要么就别用bmp 而是在pic上直接作图 外面嵌套个panel,然后缩放pic 这样你获取的坐标就是准确的坐标了
於黾 2015-06-18
  • 打赏
  • 举报
回复
你是如何将bmp在pic上偏移和缩放的,自己应该保留了参数吧 根据比例换算一下坐标啊 否则当然是只能获取到鼠标点击到pic上的坐标,编译器也没法知道你的pic和你后台的bmp是啥关系
加载更多回复(1)

110,536

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧