Jungs, danke für deine Hilfe. Ich denke, all diese Antworten funktionieren. Ich denke jedoch, dass mein Byte-Array Rohbytes enthält. Deshalb haben all diese Lösungen für meinen Code nicht funktioniert.
Ich habe jedoch eine Lösung gefunden. Vielleicht hilft diese Lösung anderen Programmierern, die Probleme wie meine haben.
static byte[] PadLines(byte[] bytes, int rows, int columns) {
int currentStride = columns;
int newStride = columns;
byte[] newBytes = new byte[newStride * rows];
for (int i = 0; i < rows; i++)
Buffer.BlockCopy(bytes, currentStride * i, newBytes, newStride * i, currentStride);
return newBytes;
}
int columns = imageWidth;
int rows = imageHeight;
int stride = columns;
byte[] newbytes = PadLines(imageData, rows, columns);
Bitmap im = new Bitmap(columns, rows, stride,
PixelFormat.Format8bppIndexed,
Marshal.UnsafeAddrOfPinnedArrayElement(newbytes, 0));
im.Save("C:\\Users\\musa\\Documents\\Hobby\\image21.bmp");
Diese Lösung funktioniert für 8 Bit 256 bpp (Format8bppIndexed). Wenn Ihr Bild ein anderes Format hat, sollten Sie es ändernPixelFormat
.
Und im Moment gibt es ein Problem mit Farben. Sobald ich dieses Problem gelöst habe, werde ich meine Antwort für andere Benutzer bearbeiten.
* PS = Ich bin mir über den Schrittwert nicht sicher, aber für 8 Bit sollte er gleich den Spalten sein.
Und auch diese Funktion funktioniert bei mir. Diese Funktion kopiert 8-Bit-Graustufenbilder in ein 32-Bit-Layout.
public void SaveBitmap(string fileName, int width, int height, byte[] imageData)
{
byte[] data = new byte[width * height * 4];
int o = 0;
for (int i = 0; i < width * height; i++)
{
byte value = imageData[i];
data[o++] = value;
data[o++] = value;
data[o++] = value;
data[o++] = 0;
}
unsafe
{
fixed (byte* ptr = data)
{
using (Bitmap image = new Bitmap(width, height, width * 4,
PixelFormat.Format32bppRgb, new IntPtr(ptr)))
{
image.Save(Path.ChangeExtension(fileName, ".jpg"));
}
}
}
}