65.9K
CodeProject 正在变化。 阅读更多。
Home

图像放大镜控件

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.45/5 (5投票s)

2006年10月11日

CPOL

2分钟阅读

viewsIcon

60355

downloadIcon

2461

ImageMagnifier - 一个简单的图像缩放控件。

Sample Image - ImageMagnifier.gif

引言

常用的 PictureBox 控件,经常用于 .NET Windows Forms 应用程序中,是一个非常实用且复杂的控件,允许我们显示图形信息。但没有什么是完美的,PictureBox 也有其自身的缺点。其中之一,我遇到的问题是缩放时图像模糊。当你尝试缩放小尺寸图片时,它看起来会变得模糊不清。因此,我决定编写一个简单的图像缩放控件,并将其命名为 ImageMagnifier

使用代码

ImageMagnifier 是一个 WinForms 控件,可以像任何其他控件一样使用。只需在新的项目中添加对 ImageMagnifier.dll 程序集的引用。然后,你可以通过从 Visual Studio 工具箱中拖动它来将控件添加到你的窗体中,或者你可以使用如下代码以编程方式创建它

ImageMagnifier.ImageMagnifier imageMagnifier = 
                  new ImageMagnifier.ImageMagnifier(); 
this.Controls.Add(imageMagnifier);

ImageMagnifier 具有一个 ImageToMagnify 属性,它对应于一个 Image 类。你可以在项目的属性窗口中或以编程方式设置它

imageMagnifier.ImageToMagnify = Image.FromFile("SomeImage.jpg");

然后,你必须设置 MagnificationCoefficient 属性。它是一个 Int32 值,取值范围为 1 到 64

imageMagnifier.MagnificationCoefficient = 10;

这就是你需要做的全部。运行你的应用程序后,你将看到定义的图像,以 MagnificationCoefficient 倍数放大。

工作原理

该控件非常简单。它继承自 Control 类并重写了 OnPaint 方法。与 ImageMagnifier 关联的图像表示为二维 Int32 像素数组 (ImageMagnifier.pixels)。每当用户定义 ImageToMagnify 属性时,该数组都会填充相应像素的颜色

public Image ImageToMagnify
{
    get { return imageToMagnify; }
    set 
    {
        if (value != null)
        {
            imageToMagnify = value;
            Bitmap b = new Bitmap(this.ImageToMagnify);

            pixels = new int[this.ImageToMagnify.Width, 
                             this.ImageToMagnify.Height];

            for (int i = 0; i < this.ImageToMagnify.Width; i++)
                for (int j = 0; j < this.ImageToMagnify.Height; j++)
                {
                    pixels[i, j] = b.GetPixel(i, j).ToArgb();
                }
            this.Invalidate();
        }
    }
}

OnPaint 方法如下

protected override void OnPaint(PaintEventArgs pe)
{
    if (imageToMagnify != null)
    {
        this.Width = imageToMagnify.Width * magnificationCoefficient;
        this.Height = imageToMagnify.Height * magnificationCoefficient;

        int currentTop = 0;
        int currentLeft = 0;
        for (int i = 0; i < this.ImageToMagnify.Width; i++)
        {
            currentTop = i * magnificationCoefficient;
            for (int j = 0; j < this.ImageToMagnify.Height; j++)
            {
                currentLeft = j * magnificationCoefficient;
                Brush b = new SolidBrush(Color.FromArgb(pixels[i, j]));
                pe.Graphics.FillRectangle(b, currentTop, currentLeft, 
                magnificationCoefficient, magnificationCoefficient);
            }
        }
    }
}

因此,每次控件调用 OnPaint 方法时,它都会从 pixels 数组中为每个像素绘制矩形。每个矩形的大小由 MagnificationCoefficient 属性确定。

© . All rights reserved.