Exemplo n.º 1
0
        /// <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);
        }