热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

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

做了一个winform的图片浏览器,放入了splitContainer,在panel1中加入了picturebox,然后通过picturebox的事件MOVE,CLICK,UP,DOUWN,MOUS
做了一个winform的图片浏览器,放入了splitContainer,在panel1中加入了picturebox,然后通过picturebox的事件MOVE,CLICK,UP,DOUWN, MOUSEwHILE,用两种方法实现了图片的放大,缩小,拖动,(针对picturebox控件和picturebox.image进行的),当图片大小大于picturebox时,图像显示不完,如果在不拖动的情况下,要想看不到的区域作图,就需要拖动图片作图,但是作图(bitmap)后发现画上去的线或者图片与自己想要画的位置出现了偏移,估计是坐标系不同,导致在鼠标down的时候取到的位置并不是图片上的x,y,而是工作区中的x,和y,现在不知道该怎么做了,请各位高手指点!!!!

21 个解决方案

#1


PointToClient()试试呢

#2


你是如何将bmp在pic上偏移和缩放的,自己应该保留了参数吧
根据比例换算一下坐标啊
否则当然是只能获取到鼠标点击到pic上的坐标,编译器也没法知道你的pic和你后台的bmp是啥关系

#3


要么就别用bmp
而是在pic上直接作图

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

#4


引用 1 楼 pig357 的回复:
PointToClient()试试呢


这个方法已经试了,行不通

#5


引用 2 楼 Z65443344 的回复:
你是如何将bmp在pic上偏移和缩放的,自己应该保留了参数吧
根据比例换算一下坐标啊
否则当然是只能获取到鼠标点击到pic上的坐标,编译器也没法知道你的pic和你后台的bmp是啥关系


我是直接把bmp画在了pic.image上的

#6


引用 5 楼 hxl199109 的回复:
Quote: 引用 2 楼 Z65443344 的回复:

你是如何将bmp在pic上偏移和缩放的,自己应该保留了参数吧
根据比例换算一下坐标啊
否则当然是只能获取到鼠标点击到pic上的坐标,编译器也没法知道你的pic和你后台的bmp是啥关系


我是直接把bmp画在了pic.image上的

也就是说,偏移量,缩放比例,你自己都不知道,只不过是设置了pic的属性之后它就自动调整了?
那就没啥好办法了.

不行试试我说的方法,让pic不要缩放图片,而是根据图片实际大小显示
然后让pic在panel里移动位置
这样你点击pic的时候获取到的坐标就绝对是准确的坐标了

#7


引用 3 楼 Z65443344 的回复:
要么就别用bmp
而是在pic上直接作图

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


我就是在panel上放了一个picturebox,然后把panel置于底层的,然后对picturebox进行拖动,放大和缩小

#8


引用 7 楼 hxl199109 的回复:
Quote: 引用 3 楼 Z65443344 的回复:

要么就别用bmp
而是在pic上直接作图

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


我就是在panel上放了一个picturebox,然后把panel置于底层的,然后对picturebox进行拖动,放大和缩小

那么既然你已经放大缩小过了,放大缩小的比例你得用变量记住啊,不能直接赋值给控件拉倒了
否则怎么计算啊

#9


要么你用pic.width/bmp.width来算比例,然后根据比例,将坐标换算成bmp的坐标

#10


引用 3 楼 Z65443344 的回复:
要么就别用bmp
而是在pic上直接作图

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

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





#11


为啥要减去e.Location.X??

既然是picturebox的点击事件,那就是picturebox的相对坐标,跟panel和form没有关系

你不要管picturebox相对于panel的坐标是啥

#12


晕,看错了
你那是计算鼠标移动

现在的问题是,你获取了e.X和e.Y就直接把它当bmp的像素坐标了
但是picturebox本身就缩放过,和bmp已经不是同样的大小了

所以需要一个比例换算

#13


比如你的bmp大小是200*200
你的pic大小是50*50

那么点击(20,20)这个点,对应bmp并不是(20,20),而是(80,80)
这个应该能理解吧

#14


picturebox 在 panel 中
鼠标位置是参照 panel 的
当 panel 的滚动条被拖动后(假定向右 100 个像素)picturebox 的 left 将是 -100
这一点你打印出来看一下就知道了
所以画图时,要把鼠标位置折算的 picturebox,因为你是在 picturebox 中画图

#15


bmpX/e.X=bmp.Width/pic.Width
等比公式
把e.X挪到等式右边去就计算出真实的坐标了

#16


引用 13 楼 Z65443344 的回复:
比如你的bmp大小是200*200
你的pic大小是50*50

那么点击(20,20)这个点,对应bmp并不是(20,20),而是(80,80)
这个应该能理解吧

理解当然理解了,换算过程在任何过程都要进行吗?还是只进行一次,比如,点击,缩放,拖拽?

#17


引用 15 楼 Z65443344 的回复:
bmpX/e.X=bmp.Width/pic.Width
等比公式
把e.X挪到等式右边去就计算出真实的坐标了


换算了也不对啊,再仔细看看?有没有类似的Demo之类的?

#18


引用 15 楼 Z65443344 的回复:
bmpX/e.X=bmp.Width/pic.Width
等比公式
把e.X挪到等式右边去就计算出真实的坐标了


换算过后坐标的值都成负的了

#19


我这看看,这个我当时也没计算出来,不知道如何计算偏差,当时我遇到的问题是计算滚动条便宜位置的,后来作罢了

你琢磨出来算法了之后,@我一下,让我也学习学习

#20


不要使用picturebox,使用panel自定义控件自定义,进行无刷新重绘,利用绘制坐标,图片与控件显示比例,鼠标点击坐标等,计算对应图片上的坐标

#21


试试减去picturebox的location.x和location.y

推荐阅读
  • 微软头条实习生分享深度学习自学指南
    本文介绍了一位微软头条实习生自学深度学习的经验分享,包括学习资源推荐、重要基础知识的学习要点等。作者强调了学好Python和数学基础的重要性,并提供了一些建议。 ... [详细]
  • 在Android开发中,使用Picasso库可以实现对网络图片的等比例缩放。本文介绍了使用Picasso库进行图片缩放的方法,并提供了具体的代码实现。通过获取图片的宽高,计算目标宽度和高度,并创建新图实现等比例缩放。 ... [详细]
  • 本文介绍了RPC框架Thrift的安装环境变量配置与第一个实例,讲解了RPC的概念以及如何解决跨语言、c++客户端、web服务端、远程调用等需求。Thrift开发方便上手快,性能和稳定性也不错,适合初学者学习和使用。 ... [详细]
  • 加密世界下一个主流叙事领域:L2、跨链桥、GameFi等
    本文介绍了加密世界下一个主流叙事的七个潜力领域,包括L2、跨链桥、GameFi等。L2作为以太坊的二层解决方案,在过去一年取得了巨大成功,跨链桥和互操作性是多链Web3中最重要的因素。去中心化的数据存储领域也具有巨大潜力,未来云存储市场有望达到1500亿美元。DAO和社交代币将成为购买和控制现实世界资产的重要方式,而GameFi作为数字资产在高收入游戏中的应用有望推动数字资产走向主流。衍生品市场也在不断发展壮大。 ... [详细]
  • Html5-Canvas实现简易的抽奖转盘效果
    本文介绍了如何使用Html5和Canvas标签来实现简易的抽奖转盘效果,同时使用了jQueryRotate.js旋转插件。文章中给出了主要的html和css代码,并展示了实现的基本效果。 ... [详细]
  • 本文介绍了在CentOS上安装Python2.7.2的详细步骤,包括下载、解压、编译和安装等操作。同时提供了一些注意事项,以及测试安装是否成功的方法。 ... [详细]
  • 先看官方文档TheJavaTutorialshavebeenwrittenforJDK8.Examplesandpracticesdescribedinthispagedontta ... [详细]
  • This article discusses the efficiency of using char str[] and char *str and whether there is any reason to prefer one over the other. It explains the difference between the two and provides an example to illustrate their usage. ... [详细]
  • 本文讨论了在VMWARE5.1的虚拟服务器Windows Server 2008R2上安装oracle 10g客户端时出现的问题,并提供了解决方法。错误日志显示了异常访问违例,通过分析日志中的问题帧,找到了解决问题的线索。文章详细介绍了解决方法,帮助读者顺利安装oracle 10g客户端。 ... [详细]
  • Android自定义控件绘图篇之Paint函数大汇总
    本文介绍了Android自定义控件绘图篇中的Paint函数大汇总,包括重置画笔、设置颜色、设置透明度、设置样式、设置宽度、设置抗锯齿等功能。通过学习这些函数,可以更好地掌握Paint的用法。 ... [详细]
  • 本文介绍了在Android开发中使用软引用和弱引用的应用。如果一个对象只具有软引用,那么只有在内存不够的情况下才会被回收,可以用来实现内存敏感的高速缓存;而如果一个对象只具有弱引用,不管内存是否足够,都会被垃圾回收器回收。软引用和弱引用还可以与引用队列联合使用,当被引用的对象被回收时,会将引用加入到关联的引用队列中。软引用和弱引用的根本区别在于生命周期的长短,弱引用的对象可能随时被回收,而软引用的对象只有在内存不够时才会被回收。 ... [详细]
  • 关键词:Golang, Cookie, 跟踪位置, net/http/cookiejar, package main, golang.org/x/net/publicsuffix, io/ioutil, log, net/http, net/http/cookiejar ... [详细]
  • 配置IPv4静态路由实现企业网内不同网段用户互访
    本文介绍了通过配置IPv4静态路由实现企业网内不同网段用户互访的方法。首先需要配置接口的链路层协议参数和IP地址,使相邻节点网络层可达。然后按照静态路由组网图的操作步骤,配置静态路由。这样任意两台主机之间都能够互通。 ... [详细]
  • 合并列值-合并为一列问题需求:createtabletab(Aint,Bint,Cint)inserttabselect1,2,3unionallsel ... [详细]
  • Java 11相对于Java 8,OptaPlanner性能提升有多大?
    本文通过基准测试比较了Java 11和Java 8对OptaPlanner的性能提升。测试结果表明,在相同的硬件环境下,Java 11相对于Java 8在垃圾回收方面表现更好,从而提升了OptaPlanner的性能。 ... [详细]
author-avatar
fuxw
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有