如果图像包含通过计算像素数和排列方式,我们如何从图像中获取信息。
问问题
437 次
3 回答
2
您可以使用 .Net 中的 Bitmap 类
这是一个很好的例子:使用 C# 和 GDI+ 第 1 部分的傻瓜图像处理 - 每像素过滤器
以下StackOverflow(问题:如何在 C# 中以像素级别操作图像)也提供了答案:D
于 2012-04-16T13:51:44.803 回答
0
您可以使用位图 (System.Drawing)类。然后,要操作像素,请使用GetPixel()和SetPixel()方法。但是,如果您想要更快地访问像素,请阅读这篇文章:使用 LockBits 方法访问Bob Powell的图像数据,该方法利用指针,使用不安全代码进行编译。
于 2012-04-16T14:15:10.000 回答
0
这是使用指针操作像素数据的示例。
unsafe
{
int red, blue, green;
editImage = new Bitmap("image.jpg");
editWidth = editImage.Width;
editHeight = editImage.Height;
data = editImage.LockBits(new Rectangle(0, 0, editWidth, editHeight),
ImageLockMode.ReadWrite, PixelFormat.Format24bppRgb);
byte* dataPtr = (byte*)data.Scan0;
h = trackBar1.Value / 60.0;
D = 1 - Math.Abs((h % 2) - 1);
if (h >= 0 && h < 1)
{
for (int i = 0; i < editHeight; i++)
{
offsetStride = i * data.Stride;
for (int j = 0; j < editWidth; j++)
{
blue = dataPtr[(j * 3) + offsetStride];
green = dataPtr[(j * 3) + offsetStride + 1];
red = dataPtr[(j * 3) + offsetStride + 2];
if (green > blue) max = green;
else max = blue;
if (red > max) max = red;
if (green < blue) min = green;
else min = blue;
if (red < min) min = red;
s = (max == 0) ? 0 : 1d - (1d * min / max);
v = max / 255d;
C = v * s;
X = C * D;
E = v - C;
dataPtr[(j * 3) + offsetStride] = (byte)(min);
dataPtr[(j * 3) + offsetStride + 1] = (byte)((X + E) * 255);
dataPtr[(j * 3) + offsetStride + 2] = (byte)(max);
}
}
}
}
这只是改变图像的色调。对于任何大于 100x100 像素的相当大的图像,除非性能无关紧要,否则不要费心使用 GetPixel 或 SetPixel。
于 2012-04-17T00:25:17.487 回答