缩放图片怎么限定一个最小与最大尺寸? 还有怎样防止不飞出边界?

sosoben 2017-04-21 04:33:49

我有一个WPF image控件,已经实现了双指缩放选择,单指移动等功能了。

但想问问缩放图片怎么限定一个最小与最大尺寸? 还有怎样防止不飞出边界?


private void img_ManipulationDelta(object sender, ManipulationDeltaEventArgs e)
{
FrameworkElement element = (FrameworkElement)e.Source;
element.Opacity = 0.5;

//Matrix matrix = ((MatrixTransform)element.RenderTransform).Matrix;
Matrix matrix = ((MatrixTransform)Matrix1 ).Matrix;
var deltaManipulation = e.DeltaManipulation;

Point center = new Point(element.ActualWidth / 2, element.ActualHeight / 2);


center = matrix.Transform(center);

matrix.ScaleAt(deltaManipulation.Scale.X, deltaManipulation.Scale.Y, center.X, center.Y);

matrix.RotateAt(e.DeltaManipulation.Rotation, center.X, center.Y);

matrix.Translate(e.DeltaManipulation.Translation.X, e.DeltaManipulation.Translation.Y);

//以下为飞出边界则停止惯性,但实际测试不太生效,还是会飞出窗口,不见了
Rect containingRect = new Rect(((FrameworkElement)e.ManipulationContainer).RenderSize);
Rect shapeBounds = element.RenderTransform.TransformBounds(new Rect(element.RenderSize));



if (e.IsInertial && !containingRect.Contains(shapeBounds))
{

e.ReportBoundaryFeedback(e.DeltaManipulation);

e.Complete();

}



((MatrixTransform)Matrix1).Matrix = matrix;
}
...全文
2933 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
weixin_34267702 2018-06-26
  • 打赏
  • 举报
回复
引用 8 楼 sosoben 的回复:
[quote=引用 7 楼 weixin_34267702 的回复:]
为什么要停止惯性,这个其实就是边界max的问题 最值设置之后就不会飞出去了


有具体代码吗?上面几个答主的有些不生效,所以我才怀疑是惯性问题。[/quote]

哥们我才看到这问题。。。 尴尬中。。。 具体的代码我还真没有 这个其实就是最大值的问题,要给定最值它才不会出去
sosoben 2017-07-03
  • 打赏
  • 举报
回复
引用 7 楼 weixin_34267702 的回复:
为什么要停止惯性,这个其实就是边界max的问题 最值设置之后就不会飞出去了
有具体代码吗?上面几个答主的有些不生效,所以我才怀疑是惯性问题。
weixin_34267702 2017-05-17
  • 打赏
  • 举报
回复
为什么要停止惯性,这个其实就是边界max的问题 最值设置之后就不会飞出去了
sosoben 2017-04-21
  • 打赏
  • 举报
回复
引用 5 楼 duanzi_peng 的回复:
[quote=引用 3 楼 sosoben 的回复:] [quote=引用 1 楼 duanzi_peng 的回复:] 将图片的maxWidth与maxHeight 设置为父容器的ActualWidth,ActualHeight,类似:

  <Border x:Name="border" Width="350" Height="350" BorderBrush="Red" BorderThickness="1">
        <Image x:Name="img" Source="xxx.png" MaxWidth="{Binding ActualWidth,ElementName=border}">
               <Image.LayoutTransform>
                   <ScaleTransform ScaleX="{Binding xx}"  ScaleY="{Binding xx}"></ScaleTransform>
                </Image.LayoutTransform>
         </Image>
         </Border>
这个可以运算的吗? 例如 ActualWidth * 2 之类的[/quote] 可以,写个WPF Converter转换类;[/quote] 不行啊,MinWidth="400" 我设成常数都试过了,还是可以缩得很小很小。
  • 打赏
  • 举报
回复
引用 3 楼 sosoben 的回复:
[quote=引用 1 楼 duanzi_peng 的回复:] 将图片的maxWidth与maxHeight 设置为父容器的ActualWidth,ActualHeight,类似:

  <Border x:Name="border" Width="350" Height="350" BorderBrush="Red" BorderThickness="1">
        <Image x:Name="img" Source="xxx.png" MaxWidth="{Binding ActualWidth,ElementName=border}">
               <Image.LayoutTransform>
                   <ScaleTransform ScaleX="{Binding xx}"  ScaleY="{Binding xx}"></ScaleTransform>
                </Image.LayoutTransform>
         </Image>
         </Border>
这个可以运算的吗? 例如 ActualWidth * 2 之类的[/quote] 可以,写个WPF Converter转换类;
sosoben 2017-04-21
  • 打赏
  • 举报
回复
引用 2 楼 Libby1984 的回复:
给你一个简单思路: 在对matrix进行放大或者缩小之前,先计算出放大后需要的宽度和高度,如果宽度或者高度大于最大的值,则按照最大高度和宽度重新计算放大系数,将新算的结果作为matrix放大的倍数。最小的同样。 防止出边界:在Translate之前,计算移动后的坐标(x,y),如果x或者y小于零不允许移动,设置偏移的水平或者垂直量为0,这样就不会抛出上边界和左边界。如果x+宽度>右边界,则不允许移动;如果y+高度>下边界,则不允许移动。
而事实上,我是不会单独获取放大后或移动后的值,自己用矩阵乘法算吗??还是有更好的办法?
sosoben 2017-04-21
  • 打赏
  • 举报
回复
引用 1 楼 duanzi_peng 的回复:
将图片的maxWidth与maxHeight 设置为父容器的ActualWidth,ActualHeight,类似:

  <Border x:Name="border" Width="350" Height="350" BorderBrush="Red" BorderThickness="1">
        <Image x:Name="img" Source="xxx.png" MaxWidth="{Binding ActualWidth,ElementName=border}">
               <Image.LayoutTransform>
                   <ScaleTransform ScaleX="{Binding xx}"  ScaleY="{Binding xx}"></ScaleTransform>
                </Image.LayoutTransform>
         </Image>
         </Border>
这个可以运算的吗? 例如 ActualWidth * 2 之类的
  • 打赏
  • 举报
回复
给你一个简单思路: 在对matrix进行放大或者缩小之前,先计算出放大后需要的宽度和高度,如果宽度或者高度大于最大的值,则按照最大高度和宽度重新计算放大系数,将新算的结果作为matrix放大的倍数。最小的同样。 防止出边界:在Translate之前,计算移动后的坐标(x,y),如果x或者y小于零不允许移动,设置偏移的水平或者垂直量为0,这样就不会抛出上边界和左边界。如果x+宽度>右边界,则不允许移动;如果y+高度>下边界,则不允许移动。
  • 打赏
  • 举报
回复
将图片的maxWidth与maxHeight 设置为父容器的ActualWidth,ActualHeight,类似:

  <Border x:Name="border" Width="350" Height="350" BorderBrush="Red" BorderThickness="1">
        <Image x:Name="img" Source="xxx.png" MaxWidth="{Binding ActualWidth,ElementName=border}">
               <Image.LayoutTransform>
                   <ScaleTransform ScaleX="{Binding xx}"  ScaleY="{Binding xx}"></ScaleTransform>
                </Image.LayoutTransform>
         </Image>
         </Border>
内容概要:本文探讨了将ChatGPT与工业领域结合的应用路径,提出通过将个人工作记录持续输入ChatGPT,将其培养成具备个体经验的工业AI助手。作者结合自身作为设备工程师的实际工作场景,开展实验验证:通过多次录入电机、轴承等设备的振动分析数据与诊断结论,测试ChatGPT在不同数据相似度下的响应表现。实验表明,当输入数据与历史记录高度一致时,ChatGPT能准确复现原有判断;随着工作记录积累越完整,其推理和关联能力越强,未来有望复制个人专业经验。文章强调,工业场景缺乏基础数据,难以直接用新技术解决老问题,因此“人即AI,AI即人”的渐进式融合路径更具可行性。 适合人群:从事工业设备管理、状态监测、故障诊断的工程师,以及关注AIGC在垂直行业落地的技术研究人员。 使用场景及目标:①构建基于个人经验的工业AI助手,辅助设备故障诊断决策;②探索大模型在数据稀缺工业场景下的可持续训练路径;③实现经验知识的数字化沉淀与智能复用。 阅读建议:此资源侧重于理念创新与实验验证,读者可借鉴其方法论,结合自身工作流持续输入专业数据,逐步训练专属工业AI助手,并在实践中评估其准确性与演化能力。
内容概要:本文围绕超导磁能储存系统的建模与仿真展开研究,重点基于Simulink平台构建系统动态模型,涵盖超导线圈的电磁特性、能量转换接口、冷却系统及其与电网的交互机制等关键环节。通过设置不同工况进行仿真分析,深入探究系统在电力网络中的动态响应行为、稳定性表现及能量存储效率,评估其在提升电网动态响应能力和运行稳定性方面的应用潜力。研究还结合先进控制策略(如模糊PID、遗传算法优化等),优化系统控制性能,进一步提升储能系统的调节精度与响应速度,为超导储能技术的实际工程应用提供理论依据与仿真验证支持。; 适合人群:具备电力系统、电气工程、自动化或相关专业背景,熟悉Simulink仿真环境与基本电力电子拓扑结构,从事科研、教学或工程开发的高年级本科生、研究生及科研技术人员。; 使用场景及目标:①用于高校科研教学中深入理解超导储能系统的工作原理与动态建模方法;②为电力系统仿真项目提供高保真度的储能单元建模参考;③支撑新型大容量储能系统的设计、控制策略开发与并网性能评估,目标是掌握超导磁能储存系统的全流程建模、仿真分析与控制优化方法。; 阅读建议:建议读者结合Simulink软件动手搭建系统模型,分模块实现超导线圈、变流器、冷却与控制单元,并逐步集成调试;重点关注系统在故障或负荷突变下的动态响应特性,尝试引入不同优化算法进行控制器参数整定,以深化对系统控制机理与性能边界的理解。

7,655

社区成员

发帖
与我相关
我的任务
社区描述
Windows Phone是微软发布的一款手机操作系统,它将微软旗下的Xbox LIVE游戏、Zune音乐与独特的视频体验整合至手机中。
社区管理员
  • Windows客户端开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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