У меня есть класс, который создает матрицу значений Color
, читая Bitmap
. Класс непосредственно читает каждый байт в пикселях внутри блока unsafe
, используя указатель на изображение. Цель этого класса - прочитать значения пикселей в память, где я могу запустить фильтры для них перед сохранением изображения в виде нового файла.
Я могу воссоздать изображение, используя метод setPixel () GDI + , однако это слишком медленно для моих нужд.
Я пытаюсь сохранить новый файл изображения, используя следующую функцию:
public void saveImageFromPixels()
{
this.newBitmap = new Bitmap(srcBitmap.Width, srcBitmap.Height);
BitmapData imgData = newBitmap.LockBits(new Rectangle(0, 0, newBitmap.Width, newBitmap.Height),
ImageLockMode.ReadWrite,
PixelFormat.Format24bppRgb);
int stride = imgData.Stride;
System.IntPtr Scan0 = imgData.Scan0;
unsafe
{
byte* p = (byte*)(void*)Scan0;
int nOffset = stride - newBitmap.Width * 3;
for (int x = 0; x < newBitmap.Height; ++x)
{
for (int y = 0; y < newBitmap.Width; ++y)
{
p[0] = (byte)(255 - matrix[y][x].B);
p[1] = (byte)(255 - matrix[y][x].G);
p[2] = (byte)(255 - matrix[y][x].R);
p += 3;
}
p += nOffset;
}
}
this.newBitmap.Save(@"C:\images\1-d.jpg");
}
Однако в результате получается пустое изображение (с правильными размерами). Код, который напрямую обращается к пикселям и сохраняет значение как Color
, работает нормально, он просто сохраняет изображение, с которым у меня проблемы.
Следующий код определяет srcBitmap
и newBitmap
private Bitmap srcBitmap;
private Bitmap newBitmap;
private List<List<Color>> matrix;
public PixelMatrix(string path)
{
this.srcBitmap = new Bitmap(path);
this.matrix = new List<List<Color>>(srcBitmap.Width);
for (int x = 0; x < srcBitmap.Width; x++)
{
this.matrix.Add(new List<Color>(srcBitmap.Height));
}
}