/// <summary> /// Speichert die enthaltene Bitmap in die angegebene Datei. /// </summary> /// <param name="filename">Die Datei, in die das Bild gespeichert werden soll.</param> public void saveToFile(string filename) { // Bilddatenbreite ggf. auf ein Vielfaches von 4 Bytes erhöhen int width = _header.width; // Hilfsvariable zur Performanceerhöhung (immer gleichwertig mit _header.width) int width2 = width; while(width2 % 4 != 0) { width2++; } // Bilddaten-Binär-Zielarray erstellen _imageDataBin = new byte[width2 * Math.Abs(_header.height)]; // Bilddaten in Zielarray schreiben int height2 = Math.Abs(_header.height); for(int x = 0; x < width2; x++) // Start: Links { for(int y = 0; y < height2; y++) // Start: Oben { if(x >= width) { // Falls x außerhalb der Bildbreite liegt, Füllbyte einsetzen _imageDataBin[y * width2 + x] = 0; } else { // Normaler Pixel: Farbtabellenindex schreiben, dabei Bottom-Up-Richtung beachten _imageDataBin[y * width2 + x] = _imageData[(height2 - y - 1) * width + x]; } } } // Header vorbereiten (einige wurden zwar schon definiert, aber lieber alle beisammen) _header.type = 19778; _header.fileSize = (uint)(44 + 256 * 4 + _imageDataBin.Length); _header.reserved = 0; _header.offsetData = (uint)(44 + 256 * 4); _header.imageHeaderSize = 40; _header.width = width; _header.height = height2; _header.layerCount = 1; _header.bitsPerPixel = 8; _header.compression = Header.COMPR_RGB; _header.size = (uint)(height2 * width); _header.xDPI = 0; _header.yDPI = 0; _header.colorCount = 0; _header.colorImportantCount = 0; // Puffer-Objekt erstellen _buffer = new RAMBuffer(); // Header schreiben WriteUShort(_header.type); WriteUInteger(_header.fileSize); WriteUInteger(_header.reserved); WriteUInteger(_header.offsetData); WriteUInteger(_header.imageHeaderSize); WriteInteger(_header.width); WriteInteger(_header.height); WriteUShort(_header.layerCount); WriteUShort(_header.bitsPerPixel); WriteUInteger(_header.compression); WriteUInteger(_header.size); WriteInteger(_header.xDPI); WriteInteger(_header.yDPI); WriteUInteger(_header.colorCount); WriteUInteger(_header.colorImportantCount); // Farbtabelle schreiben _colorTable.ToBinary(ref _buffer); // Bilddaten schreiben WriteBytes(_imageDataBin); // Bitmap schreiben _buffer.Save(filename); }