以下是我在我的应用程序中使用的几种方法
这个'突出显示'选择了一个区域(在MouseMove事件中调用,因此它经常被用来实时显示您选择的内容)。
忽略缩放变量,这样如果图像已调整大小以适合控件,则所选区域会被正确反映
private Bitmap DrawCropArea(Bitmap bm, Rectangle area)
{
int x = (int)Math.Round(area.X / scaling);
int y = (int)Math.Round(area.Y / scaling);
int cropWidth = (int)Math.Round(area.Width / scaling);
int cropHeight = (int)Math.Round(area.Height / scaling);
using (Graphics gr = Graphics.FromImage(bm))
{
Brush brush = new Pen(Color.FromArgb(200, Color.DarkGray)).Brush;
Rectangle rect1 = new Rectangle(0, 0, bm.Width, y);
Rectangle rect2 = new Rectangle(0, y, x, cropHeight);
Rectangle rect3 = new Rectangle(0, (y + cropHeight), bm.Width, bm.Height);
Rectangle rect4 = new Rectangle((x + cropWidth), y, (bm.Width - x - cropWidth), cropHeight);
gr.FillRectangle(brush, rect1);
gr.FillRectangle(brush, rect2);
gr.FillRectangle(brush, rect3);
gr.FillRectangle(brush, rect4);
}
return bm;
}
这可以设置亮度和对比度,就像以前的方法一样,它经常在2轨道栏上调用EditValueChanging事件
private Bitmap ChangeBrightnessContrast(Bitmap bm, float cont, int bright)
{
float[][] arr =
{
new float[] { 1, 0, 0, 0, 0 },
new float[] { 0, 1, 0, 0, 0 },
new float[] { 0, 0, 1, 0, 0 },
new float[] { 0, 0, 0, 1, 0 },
new float[] { 0, 0, 0, 0, 1 },
};
ColorMatrix cMatrix = new ColorMatrix(arr);
cMatrix.Matrix00 = cMatrix.Matrix11 = cMatrix.Matrix22 = cont;
cMatrix.Matrix40 = cMatrix.Matrix41 = cMatrix.Matrix42 = bright / 255.0F;
ImageAttributes imgAttributes = new ImageAttributes();
imgAttributes.ClearColorMatrix();
imgAttributes.SetColorMatrix(cMatrix, ColorMatrixFlag.Default, ColorAdjustType.Bitmap);
//imgAttributes.SetGamma(1.0F, ColorAdjustType.Bitmap);
using (Graphics gr = Graphics.FromImage(bm))
{
gr.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.NearestNeighbor;
gr.DrawImage(bm, new Rectangle(0, 0, bm.Width, bm.Height), 0, 0, bm.Width, bm.Height, GraphicsUnit.Pixel, imgAttributes);
}
return bm;
}
它很好,直到我在一些较大的图像上使用它们,它开始真正滞后。
我一直在阅读很多混合信息; GDI +确实支持硬件加速,不,你不应该使用Direct2D等。所以我不确定我能用我当前使用的绘图库改变一些东西,如果我应该切换到别的东西,或者我应该做很多腿部工作并将图像转换成较低分辨率的缩略图,然后在用户满意后重新应用所有调整到全尺寸图像?