如何在C#中使用图片的字节数组
How to use the byte array of image on C#
所以,我需要使用图像的字节数组来修改,例如...我有一张 380x380 的图像,我需要取图像的 3x3 并与其他数组相乘,从而与整个图片。
我从不使用字节数组,所以我不知道我做的对不对
//Obtener byteArray de imagen
Image imageOri = Image.FromFile(Path);
var ms = new MemoryStream();
imageOri.Save(ms, System.Drawing.Imaging.ImageFormat.Jpeg);
var byteImage = ms.ToArray();
所以,当我运行这段代码时,byteImage有一个...列表?的数据,所以,我不知道如何获取图像的 3x3 来进行处理
我假设您想应用卷积过滤器。
首先,您可能想使用位图而不是图像,即 new Bitmap(Path)
。
简单的方法是遍历每个像素,然后遍历过滤器中的每个值,并 multiply/accumulate 使用相应的像素值。使用 GetPixel 获取像素值。请注意,您需要以某种方式处理图像的边界,例如跳过它们。 GetPixel
是出了名的慢,但我建议使用它来确保在优化之前确定代码。
像这样(未测试):
var bmp = new Bitmap(@"test.bmp");
var filter = new float[3, 3];
var result = new Bitmap(bmp.Width - 2, bmp.Height - 2);
for(int y = 1; y < bmp.Height-1; y++)
{
for (int x = 1; x < bmp.Width - 1; x++)
{
float r = 0;
r += bmp.GetPixel(x-1, y-1).R * filter[0, 0];
r += bmp.GetPixel(x , y-1).R * filter[1, 0];
r += bmp.GetPixel(x+1, y-1).R * filter[2, 0];
r += bmp.GetPixel(x-1, y ).R * filter[0, 1];
r += bmp.GetPixel(x , y ).R * filter[1, 1];
r += bmp.GetPixel(x+1, y ).R * filter[2, 1];
r += bmp.GetPixel(x-1, y+1).R * filter[0, 2];
r += bmp.GetPixel(x , y+1).R * filter[1, 2];
r += bmp.GetPixel(x+1, y+1).R * filter[2, 2];
// Repeat for G & B channels
result.SetPixel(x-1, y-1, Color.FromArgb((int)r, 0, 0));
}
}
所以,我需要使用图像的字节数组来修改,例如...我有一张 380x380 的图像,我需要取图像的 3x3 并与其他数组相乘,从而与整个图片。
我从不使用字节数组,所以我不知道我做的对不对
//Obtener byteArray de imagen
Image imageOri = Image.FromFile(Path);
var ms = new MemoryStream();
imageOri.Save(ms, System.Drawing.Imaging.ImageFormat.Jpeg);
var byteImage = ms.ToArray();
所以,当我运行这段代码时,byteImage有一个...列表?的数据,所以,我不知道如何获取图像的 3x3 来进行处理
我假设您想应用卷积过滤器。
首先,您可能想使用位图而不是图像,即 new Bitmap(Path)
。
简单的方法是遍历每个像素,然后遍历过滤器中的每个值,并 multiply/accumulate 使用相应的像素值。使用 GetPixel 获取像素值。请注意,您需要以某种方式处理图像的边界,例如跳过它们。 GetPixel
是出了名的慢,但我建议使用它来确保在优化之前确定代码。
像这样(未测试):
var bmp = new Bitmap(@"test.bmp");
var filter = new float[3, 3];
var result = new Bitmap(bmp.Width - 2, bmp.Height - 2);
for(int y = 1; y < bmp.Height-1; y++)
{
for (int x = 1; x < bmp.Width - 1; x++)
{
float r = 0;
r += bmp.GetPixel(x-1, y-1).R * filter[0, 0];
r += bmp.GetPixel(x , y-1).R * filter[1, 0];
r += bmp.GetPixel(x+1, y-1).R * filter[2, 0];
r += bmp.GetPixel(x-1, y ).R * filter[0, 1];
r += bmp.GetPixel(x , y ).R * filter[1, 1];
r += bmp.GetPixel(x+1, y ).R * filter[2, 1];
r += bmp.GetPixel(x-1, y+1).R * filter[0, 2];
r += bmp.GetPixel(x , y+1).R * filter[1, 2];
r += bmp.GetPixel(x+1, y+1).R * filter[2, 2];
// Repeat for G & B channels
result.SetPixel(x-1, y-1, Color.FromArgb((int)r, 0, 0));
}
}