-1

我有这个功能:

public static Bitmap ResizeImage(Bitmap imgToResize, Size size)
        {
            try
            {
                Bitmap b = new Bitmap(size.Width, size.Height);
                using (Graphics g = Graphics.FromImage((Image)b))
                {
                    g.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.HighQualityBicubic;

                    g.DrawImage(imgToResize, 0, 0, size.Width, size.Height);
                }

                return b;
            }
            catch
            {
                throw;
            }
        }

但是我如何使用什么来放入 Size 大小?我试图调用这样的函数: ResizeImage(bitmap,new Size(100,100)); 但这不是办法。

在Form1中我做了:

bitmap = new Bitmap(@"D:\ffmpegtorun\ffmpeg-20130509-git-13cb6ed-win32-static\bin\Screenshots\Screenshot000000.jpg");
            pictureBox1.Image = bitmap;

由于图片框内的所有内容都是模糊的,如果它是缩放模式或拉伸图像模式,我想将图像调整为图片框的大小,并可能将图片框模式更改为正常或拉伸图像?我不知道如何解决图片框中的这种模糊问题。

我在这里添加了放大镜的屏幕截图,它运行良好,但在图片框上移动时只会显示模糊。

这是当它处于 Stretchimage 模式时,但它也设置为 Zoom 模式时是相同的:

https://skydrive.live.com/redir?resid=EB1C71C44C3976D5!269&authkey=!AHI8lMsnZHfka60

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using System.Drawing.Drawing2D;
using System.IO;
using System.Drawing.Imaging;

namespace Magnifier20070401
{
    public partial class MagnifierForm : Form
    {
        private bool _doMove;

        public MagnifierForm()
        {
            InitializeComponent();

            _doMove = true;
            FormBorderStyle = FormBorderStyle.None;
            ShowInTaskbar = false;
            TopMost = true;
            Width = 150;
            Height = 150;
            GraphicsPath gp = new GraphicsPath();
            gp.AddEllipse(ClientRectangle);
            Region = new Region(gp);
            mTimer = new Timer();
            mTimer.Enabled = true;
            mTimer.Interval = 20;
            mTimer.Tick += new EventHandler(HandleTimer);
            mScreenImage = new Bitmap(Screen.PrimaryScreen.Bounds.Width,
                                     Screen.PrimaryScreen.Bounds.Height);
            mStartPoint = new Point(500, 500);
            mTargetPoint = new Point(500, 500);
            speed = 0.35F;
            zoom = 3.0F;
            hidecursor = false;
            hue = 30;
        }

        public MagnifierForm(bool MoveTheGlass, bool InTaskBar, int MagnifierWidth, int MagnifierHeight, Point MagnifierStartPoint, float SpeedFactor, float ChangeZoom, bool HideMouseCursor, float AdjustHue)
        {
            InitializeComponent();

            FormBorderStyle = FormBorderStyle.None;
            TopMost = true;
            GraphicsPath gp = new GraphicsPath();
            gp.AddEllipse(ClientRectangle);
            Region = new Region(gp);
            mTimer = new Timer();
            mTimer.Enabled = true;
            mTimer.Interval = 20;
            mTimer.Tick += new EventHandler(HandleTimer);
            mScreenImage = new Bitmap(Screen.PrimaryScreen.Bounds.Width,
                                     Screen.PrimaryScreen.Bounds.Height);

            _doMove = MoveTheGlass;
            ShowInTaskbar = InTaskBar;
            Width = MagnifierWidth;
            Height = MagnifierHeight;
            mStartPoint = MagnifierStartPoint;
            mTargetPoint = MagnifierStartPoint;
            speed = SpeedFactor;
            zoom = ChangeZoom;
            hidecursor = HideMouseCursor;
            hue = AdjustHue;
        }

        protected override void OnShown(EventArgs e)
        {
            RepositionAndShow();
        }

        private delegate void RepositionAndShowDelegate();

        private void RepositionAndShow()
        {
            if (InvokeRequired)
            {
                Invoke(new RepositionAndShowDelegate(RepositionAndShow));
            }
            else
            {
                Graphics g = Graphics.FromImage(mScreenImage);
                g.CopyFromScreen(0, 0, 0, 0, new Size(mScreenImage.Width, mScreenImage.Height));
                HSLAdjust.BitmapFunctions bf = new HSLAdjust.BitmapFunctions((Bitmap)mScreenImage);
                bf.Hue(hue);
                bf.Dispose();
                g.Dispose();

                if (hidecursor == true)
                {
                    Cursor.Hide();
                }
                else
                {
                    Cursor = Cursors.Cross;
                }
                Capture = true;
                mCurrentPoint = Cursor.Position;
                Show(); // to add here the bool of the Mouse Cursor to hide or not to hide
            }
        }

        void HandleTimer(object sender, EventArgs e)
        {
            float dx = speed * (mTargetPoint.X - mCurrentPoint.X);
            float dy = speed * (mTargetPoint.Y - mCurrentPoint.Y);

            if (mFirstTime)
            {
                mFirstTime = false;

                mCurrentPoint.X = mTargetPoint.X;
                mCurrentPoint.Y = mTargetPoint.Y;

                Left = (int)mCurrentPoint.X - Width / 2;
                Top = (int)mCurrentPoint.Y - Height / 2;

                return;
            }

            mCurrentPoint.X += dx;
            mCurrentPoint.Y += dy;

            if (Math.Abs(dx) < 1 && Math.Abs(dy) < 1)
            {
                mTimer.Enabled = false;
            }
            else
            {
                // Update location
                Left = (int)mCurrentPoint.X - Width / 2;
                Top = (int)mCurrentPoint.Y - Height / 2;
                mLastMagnifierPosition = new Point((int)mCurrentPoint.X, (int)mCurrentPoint.Y);
            }

            Refresh();
        }


        protected override void OnMouseDown(MouseEventArgs e)
        {
            mOffset = new Point(Width / 2 - e.X, Height / 2 - e.Y);
            mCurrentPoint = PointToScreen(new Point(e.X + mOffset.X, e.Y + mOffset.Y));
            mTargetPoint = mCurrentPoint;
            mTimer.Enabled = true;

        }

        protected override void OnMouseMove(MouseEventArgs e)
        {
            if (_doMove == true)
            {
                mTargetPoint = PointToScreen(new Point(e.X + mOffset.X, e.Y + mOffset.Y));
                mTimer.Enabled = true;
            }

        }

        protected override void OnPaintBackground(PaintEventArgs e)
        {
            /*if (mConfiguration.DoubleBuffered)
            {
                // Do not paint background (required for double buffering)!
            }
            else
            {
                base.OnPaintBackground(e);
            }*/
            base.OnPaintBackground(e);
        }

        protected override void  OnPaint(PaintEventArgs e)
        {
            if (mBufferImage == null)
            {
                mBufferImage = new Bitmap(Width, Height);
            }
            Graphics bufferGrf = Graphics.FromImage(mBufferImage);

            Graphics g;

            /*if (mConfiguration.DoubleBuffered)
            {
                g = bufferGrf;
            }
            else
            {*/
                g = e.Graphics;
            //}

            if (mScreenImage != null)
            {
                Rectangle dest = new Rectangle(0, 0, Width, Height);
                int w = (int)(Width / zoom);//mConfiguration.ZoomFactor);
                int h = (int)(Height / zoom);//mConfiguration.ZoomFactor);
                int x = Left - w / 2 + Width / 2;
                int y = Top - h / 2 + Height / 2;

                g.DrawImage(
                    mScreenImage,
                    dest,
                    x, y,
                    w, h,
                    GraphicsUnit.Pixel);
            }
                e.Graphics.DrawImage(mBufferImage, 0, 0, Width, Height);      
        }


        //--- Data Members ---
        #region Data Members
        private bool hidecursor;
        private float zoom;
        private float hue;
        private float speed;
        private Timer mTimer;
        private Image mBufferImage = null;
        private Image mScreenImage = null;
        private Point mStartPoint;
        private PointF mTargetPoint;
        private PointF mCurrentPoint;
        private Point mOffset;
        private bool mFirstTime = true;
        private static Point mLastMagnifierPosition = Cursor.Position;
        #endregion


        // New code \\

        protected override void OnMouseEnter(EventArgs e)
        {
            base.OnMouseEnter(e);

            Point pt = Control.MousePosition;
            int eX = pt.X - this.Left;
            int eY = pt.Y - this.Top;

            mOffset = new Point(0, 0);
            mCurrentPoint = PointToScreen(new Point(eX + mOffset.X, eY + mOffset.Y));
            mTargetPoint = mCurrentPoint;
            mTimer.Enabled = true;
            this.Capture = true;
        }

        protected override void OnMouseLeave(EventArgs e)
        {
            base.OnMouseLeave(e);

            if (_doMove)
            {
                Left = (int)mCurrentPoint.X - Width / 2;
                Top = (int)mCurrentPoint.Y - Height / 2;
            }
        }

        protected override void OnMouseClick(MouseEventArgs e)
        {
            base.OnMouseClick(e);
            if (_doMove == true)
            {
                _doMove = false;
            }
            else
            {
                _doMove = true;
            }
        }
    }
}

这是放大镜窗体代码,所以也许有人可以测试它,看看它在图片框上移动时有多模糊。

这就是我在 Form1 中打开/关闭放大镜的方式。

protected override bool ProcessCmdKey(ref Message msg, Keys keyData)
        {
            if (keyData == (Keys.Control | Keys.M))
            {
                if (mf == null)
                {
                    mf = new Magnifier20070401.MagnifierForm();
                    mf.StartPosition = FormStartPosition.Manual;
                    mf.Location = Control.MousePosition;
                    mf.Show();

                    this.Select();
                }
                else if (mf.IsDisposed)
                {
                    mf = new Magnifier20070401.MagnifierForm();
                    mf.StartPosition = FormStartPosition.Manual;
                    mf.Location = Control.MousePosition;
                    mf.Show();
                }
                else
                {
                    mf.Close();
                    mf = null;
                }
            }
            return base.ProcessCmdKey(ref msg, keyData);
        }
4

1 回答 1

0

将图片框大小模式设置为缩放

PictureBox1.SizeMode = PictureBoxSizeMode.Zoom;

于 2013-05-19T21:02:59.610 回答