澳门新浦京8455com图像有一些失真m,(工具类都以final

澳门新浦京8455com 1

先感谢各位大神小弟最近在学习directdraw,当使用下面的函数把一张很大的图片缩小后显示出来,图像有点失真m_pddsFrontBuffer-Blt(rtDest,m_pddsStoreBuffer,rtSrc,DDBLT_WAIT,ddbltfx);而在GDI下,通过设置为HALFTONE模式后,调用StretchBlt进行缩放,效果就会比上面用directdraw好很多pDC-SetStretchBltMode(HALFTONE);pDC-StretchBlt(l,t,w,h,this,L,T,W,H,SRCCOPY);那么在directdraw里是不是也有什么同样的方法,来控制图片缩放的质量

从本地缓存删除图片文件

比如说,在Winform里面实现鼠标拖拽图片功能的话,代码看起来像下面这样:

/**/
本人网上当的代码, 现在想新增功能呢,就是图片滚动缩放
到图片原本大小就不缩放了,拖动到图片的边角就不拖动了,

method1:findInCache

1.         定义一个TranslateTransform实例来修改图片显示的起始位置。

wpf实现图片拖动缩放,新增滚动缩放 到图片原本大小就不缩放,拖动图片到边角就不拖动
///

/// Interaction logic for UserControl1.xaml///

public partial class UserControl1 : UserControl{ public UserControl1() { InitializeComponent(); WPFWindow.MouseWheel += MainWindow_MouseWheel; image.MouseLeftButtonDown += image_MouseLeftButtonDown; image.MouseLeftButtonUp += image_MouseLeftButtonUp; image.MouseMove += image_MouseMove; } private Point origin; private Point start; ///

/// 图片路径 ///

/// public void SetSource(string fileName) { image.Source = new BitmapImage(new Uri); } ///

/// 程序高度和宽度 ///

/// /// public void setHeight_Width(int height,int width) { WPFWindow.Height = height; WPFWindow.Width = width; } private void image_MouseLeftButtonUp(object sender, MouseButtonEventArgs e) { image.ReleaseMouseCapture(); } private void image_MouseMove(object sender, MouseEventArgs e) { if (!image.IsMouseCaptured) return; Point p = e.MouseDevice.GetPosition; Matrix m = image.RenderTransform.Value; m.OffsetX = origin.X + (p.X – start.X); m.OffsetY = origin.Y + (p.Y – start.Y); image.RenderTransform = new MatrixTransform; } private void image_MouseLeftButtonDown(object sender, MouseButtonEventArgs e) { if (image.IsMouseCaptured) return; image.CaptureMouse(); start = e.GetPosition; origin.X = image.RenderTransform.Value.OffsetX; origin.Y = image.RenderTransform.Value.OffsetY; } private void MainWindow_MouseWheel(object sender, MouseWheelEventArgs e) { Point p = e.MouseDevice.GetPosition; Matrix m = image.RenderTransform.Value; if (e.Delta > 0) m.ScaleAtPrepend(1.1, 1.1, p.X, p.Y); else m.ScaleAtPrepend(1 / 1.1, 1 / 1.1, p.X, p.Y); image.RenderTransform = new MatrixTransform; } /xaml 页面/

m3:considerMaxTextureSize

4.         将TransformGroup放到当前窗体的Resource里面,这样窗体里面所有的Image控件都可以引用到这个实例。

考虑图片数据按照scale参数缩放后,尺寸仍大于系统Max,所有有可能会从新计算scale

 

内存缓存工具类,封装了方便于内存缓存操作的方法

        // 将这次鼠标的位置保存下来。

m1.getCacheDirectory

    private void
MasterImage_MouseWheel(object sender,
MouseWheelEventArgs e)

澳门新浦京8455com 1

       
PictureBox picture = sender as
PictureBox;

主要方法

3.         将两个Transform放到一个TransformGroup里面,这样Image控件就可以在显示的时候综合使用两个Transform的效果了。你可以注意一下,TransformGroup的基类也是Transform,想一想这采用的是哪一个设计模式?不知道,呃……看样子我还需要写另外一篇文章解释一下这个设计模式……不过我最近有点忙,如果你等不及看到我下一篇文章的话,还是自己Google一下吧。

m1:writeDebugLogs

       
picture.Width += e.Delta * 0.001;

通过image url+size生成内存缓存中图片对应的key

    private Point
m_PreviousMousePosition;

m1:defineTargetSizeForView

       
m_PreviousMousePosition = mousePosition;

m2:writeLogs是整个项目日志的开关

        // 0.001是我随便取的一个值,因为滚轮的Delta值太大了

p3:viewScaleType 依据什么策略缩放

}

控制是否输出DEBUG日志

       
PictureBox picture = sender as
PictureBox;

相关文章

You can leave a response, or trackback from your own site.

Leave a Reply

网站地图xml地图