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

使用 C# 中的矩阵进行图像处理

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.44/5 (32投票s)

2011年7月17日

CPOL

4分钟阅读

viewsIcon

80903

downloadIcon

11945

使用 C# 完成的图像相关操作。

scr1.jpg

引言

这是我在 C# 上的第八篇文章。 类似于我之前的文章,我受到了类似文章的启发,并尝试了这项工作。

概述

本文的目的是能够构建一个类,允许任何 C# 程序员执行图像处理功能。 我们在 C# 中这样做是因为它非常灵活。 当我们开始移动像素或根据考虑到所有像素值的计算来更改值时,我们可以看到代码变得更加复杂。

Application

该应用程序是一个基本的 Windows Forms 应用程序。 我使用一个名为 CurrentImageHandler 的单独类来处理图像,在该类中完成所有与图像相关的操作,包括保存和图形相关操作。 该功能包括获取图像信息、缩放、颜色过滤、增亮、对比度、灰度过滤、反色过滤、全分辨率调整大小、旋转和翻转、裁剪以及插入文本、任何其他图像或几何形状。 图像相关功能在名为 ImageFunctions.dll 的单独类库中处理。 滚动以标准方式实现。 Paint 方法使用 AutoScrollPosition 属性来查找我们的滚动位置,该位置通过使用 AutoScrollMinSize 属性设置。

1. 缩略图视图

scr0.jpg

ThumbnailViewFrm tFrm = new ThumbnailViewFrm(currImgHandler);
tFrm.Show();

2. 颜色滤镜

颜色滤镜有时根据其光谱吸收类型进行分类:短波通过、长波通过或带通; 漫射或锐截止; 单色或转换。 短波通过会传输所有波长直到指定的波长,然后吸收。 长波通过正好相反。 考虑到一般情况,每个滤镜都是一个带通滤镜。

这很简单 - 它只是为每种颜色添加或减去一个值。 使用此滤镜最有用的方法是将两种颜色设置为 -255,以便删除它们并查看图像的一个颜色分量。 例如,对于红色滤镜,保留红色分量不变,只需从绿色分量和蓝色分量中减去 255。

scr0.jpg scr0.jpg
scr0.jpg scr0.jpg
currImgHandler.CurrentFilterHandler.SetColorFilter(ColorFilterTypes.Red);
currImgHandler.CurrentFilterHandler.SetColorFilter(ColorFilterTypes.Green);
currImgHandler.CurrentFilterHandler.SetColorFilter(ColorFilterTypes.Blue);

3. Alpha 值

有时需要对图像进行 Alpha 处理,这是一个个人选择。 有时打印需要比观看更亮的图像。 这可以通过根据用户需求调整颜色分量来完成。 输入范围在 0 到 100 之间。

scr0.jpg scr7.jpg
AlphaFrm aFrm = new AlphaFrm();
aFrm.AlphaValue = 255;
if (aFrm.ShowDialog() == DialogResult.OK)
{
    currImgHandler.CurrentFilterHandler.SetAlphaFilter(aFrm.AlphaValue);
    this.Invalidate();
}

4. 亮度

有时需要增亮图像,同样,这是个人选择。 有时打印需要比观看更亮的图像。 这可以通过根据用户需求调整颜色分量来完成。 输入范围在 -255 到 255 之间。

scr0.jpg scr7.jpg
BrightnessForm bFrm = new BrightnessForm();
bFrm.BrightnessValue = 0;
if (bFrm.ShowDialog() == DialogResult.OK)
{
    currImgHandler.CurrentBrightnessHandler.SetBrightness(bFrm.BrightnessValue);
    this.Invalidate();
}

5. 对比度

图像的对比度处理当然是一个复杂的过程。 形成的颜色矩阵给出了某种不同的组合,这使得输入图像具有对比度。

scr0.jpg scr8.jpg
ContrastForm cFrm = new ContrastForm();
cFrm.ContrastValue = 0;
if (cFrm.ShowDialog() == DialogResult.OK)
{
    currImgHandler.CurrentContrastHandler.SetContrast(cFrm.ContrastValue);
    this.Invalidate();
}

5. 灰度

灰度过滤是指特定图像的颜色模式。 用外行人的话来说,灰度图像将是黑白图像,任何其他颜色都不会包含在其中。

基本上,它是一张黑白图像; 如果有颜色,则该图像中的颜色将被转换为相应的灰色阴影(黑色和白色之间的中间色调),从而使图像的每个部分仍然可以区分。

scr0.jpg scr9.jpg
currImgHandler.CurrentGrayscaleHandler.SetGrayscale();

6. 棕褐色调

棕褐色调过滤与灰度过滤有些相似。

scr0.jpg scr10.jpg
currImgHandler.CurrentSepiaToneHandler.SetSepiaTone();

7. 反色

这非常简单,以至于颜色分量无序排列也无关紧要。 它只是获取当前分量的相反颜色。 也就是说,例如,如果颜色分量为 00,则我们得到的相反颜色为 FF (255-0)。

scr0.jpg scr11.jpg
currImgHandler.CurrentInvHandler.SetInversion();

8. 旋转和翻转

旋转或翻转也称为创建图像的镜像。 以 90、180、270 度等角度旋转,然后水平或垂直翻转图像。 并且也可以以自定义角度旋转。

scr0.jpg scr12.jpg
//rotation
currImgHandler.CurrentRotationHandler.Flip(RotateFlipType.Rotate90FlipNone);
currImgHandler.CurrentRotationHandler.Flip(RotateFlipType.Rotate180FlipNone);
currImgHandler.CurrentRotationHandler.Flip(RotateFlipType.Rotate270FlipNone);

//flipping
currImgHandler.CurrentRotationHandler.Flip(RotateFlipType.RotateNoneFlipX);
currImgHandler.CurrentRotationHandler.Flip(RotateFlipType.RotateNoneFlipY);

//Custom Rotation
RotateForm rFrm = new RotateForm();
rFrm.RotateAngle = 0;
if (rFrm.ShowDialog() == DialogResult.OK)
{
     currImgHandler.CurrentRotationHandler.Rotate(rFrm.RotateAngle);
     this.AutoScrollMinSize = 
          new Size(Convert.ToInt32(currImgHandler.CurrentBitmap.Width), 
          Convert.ToInt32(currImgHandler.CurrentBitmap.Height));
     this.Invalidate();
}

9. 插入文本、其他图像或形状

这只是在图像中包含任何所需的东西。 这是使用图像的 Graphics 对象实现的。

scr0.jpg scr0.jpg
scr0.jpg scr0.jpg
//Inserting Text
InsertTextForm itFrm = new InsertTextForm();
itFrm.DisplayTextPositionX = itFrm.DisplayTextPositionY = 0;
if (itFrm.ShowDialog() == DialogResult.OK)
{
     currImgHandler.CurrentTextInsHandler.Insert(itFrm.DisplayText, 
       itFrm.DisplayTextPositionX, itFrm.DisplayTextPositionY, 
       itFrm.DisplayTextFont, itFrm.DisplayTextFontSize, 
       itFrm.DisplayTextFontStyle, 
       itFrm.DisplayTextAngle, itFrm.DisplayTextOpacity, 
       itFrm.DisplayTextColor1, itFrm.DisplayTextColor2, 
       itFrm.DisplayTextGradientStyle);
     this.Invalidate();
}
//Inserting Image
InsertImageForm iiFrm = new InsertImageForm();
iiFrm.DisplayImagePositionX = iiFrm.DisplayImagePositionY = 0;
if (iiFrm.ShowDialog() == DialogResult.OK)
{
    currImgHandler.CurrentImgInsHandler.Insert(iiFrm.DisplayImagePath, 
      iiFrm.DisplayImagePositionX, iiFrm.DisplayImagePositionY, 
      iiFrm.DisplayImageWidth, iiFrm.DisplayImageHeight, 
      iiFrm.DisplayImageAngle, iiFrm.DisplayImageOpacity);
    this.Invalidate();
}
//Inserting Shapes
InsertShapeForm isFrm = new InsertShapeForm();
isFrm.DisplayShapePositionX = isFrm.DisplayShapePositionY = 0;
if (isFrm.ShowDialog() == DialogResult.OK)
{
    currImgHandler.CurrentShapeInsHandler.Insert(isFrm.DisplayShape, 
      isFrm.DisplayShapePositionX, isFrm.DisplayShapePositionY, 
      isFrm.DisplayShapeWidth, isFrm.DisplayShapeHeight, isFrm.DisplayShapeAngle, 
      isFrm.DisplayShapeOpacity, isFrm.DisplayShapeColor1, 
      isFrm.DisplayShapeColor2, isFrm.DisplayShapeGradientStyle);
    this.Invalidate();
}

关注点

我还包括了撤消选项、清除图像和图像信息,这些都很简单。 此外,一些其他功能与我之前关于图像处理的文章中的功能类似,因此我在这里没有包含它们。 您可以从下载中获取它们。

另请参阅

结论

感谢您阅读本文。我期待您的反馈。您将从我这里期待更多。

© . All rights reserved.