Example #1
0
        /// <summary>
        /// Constructor to create an empty image of size and format.
        /// </summary>
        /// <param name="width"></param>
        /// <param name="height"></param>
        /// <param name="format"></param>
        public DFManualImage(int width, int height, DFBitmap.Formats format)
        {
            // Create bitmap object
            manualBitmap        = new DFBitmap();
            manualBitmap.Width  = width;
            manualBitmap.Height = height;
            manualBitmap.Format = format;

            // Set stride (1 byte per pixel for indexed, 4 bytes per pixel for all other formats)
            switch (format)
            {
            case DFBitmap.Formats.Indexed:
                manualBitmap.Stride = width;
                break;

            default:
                manualBitmap.Stride = width * 4;
                break;
            }

            // Create bitmap data
            manualBitmap.Data = new byte[manualBitmap.Stride * height];
        }
Example #2
0
        /// <summary>
        /// Get raw bytes for specified record and frame using a custom pixel format.
        /// </summary>
        /// <param name="record">Index of record.</param>
        /// <param name="frame">Index of frame.</param>
        /// <param name="alphaIndex">Index of alpha colour.</param>
        /// <param name="format">Specified pixel format to use.</param>
        /// <returns>DFBitmap object.</returns>
        public DFBitmap GetBitmapFormat(int record, int frame, byte alphaIndex, DFBitmap.Formats format)
        {
            // Get as indexed image
            if (format == DFBitmap.Formats.Indexed)
            {
                return(GetDFBitmap(record, frame));
            }

            // Create new bitmap
            const int formatWidth = 4;
            DFBitmap  srcBitmap   = GetDFBitmap(record, frame);
            DFBitmap  dstBitmap   = new DFBitmap();

            dstBitmap.Format = format;
            dstBitmap.Width  = srcBitmap.Width;
            dstBitmap.Height = srcBitmap.Height;
            dstBitmap.Stride = dstBitmap.Width * formatWidth;
            dstBitmap.Data   = new byte[dstBitmap.Stride * dstBitmap.Height];

            // Write pixel data to array
            byte a, r, g, b;
            int  srcPos = 0, dstPos = 0;

            for (int i = 0; i < dstBitmap.Width * dstBitmap.Height; i++)
            {
                // Write colour values
                byte index = srcBitmap.Data[srcPos++];
                if (index != alphaIndex)
                {
                    // Get colour values
                    a = 0xff;
                    r = myPalette.GetRed(index);
                    g = myPalette.GetGreen(index);
                    b = myPalette.GetBlue(index);

                    // Write colour values
                    switch (format)
                    {
                    case DFBitmap.Formats.BGRA:
                        dstBitmap.Data[dstPos++] = b;
                        dstBitmap.Data[dstPos++] = g;
                        dstBitmap.Data[dstPos++] = r;
                        dstBitmap.Data[dstPos++] = a;
                        break;

                    case DFBitmap.Formats.ABGR:
                        dstBitmap.Data[dstPos++] = a;
                        dstBitmap.Data[dstPos++] = b;
                        dstBitmap.Data[dstPos++] = g;
                        dstBitmap.Data[dstPos++] = r;
                        break;

                    case DFBitmap.Formats.RGBA:
                        dstBitmap.Data[dstPos++] = r;
                        dstBitmap.Data[dstPos++] = g;
                        dstBitmap.Data[dstPos++] = b;
                        dstBitmap.Data[dstPos++] = a;
                        break;

                    case DFBitmap.Formats.ARGB:
                        dstBitmap.Data[dstPos++] = a;
                        dstBitmap.Data[dstPos++] = r;
                        dstBitmap.Data[dstPos++] = g;
                        dstBitmap.Data[dstPos++] = b;
                        break;

                    default:
                        throw new Exception("Unknown output format.");
                    }
                }
                else
                {
                    // Step over alpha pixels
                    dstPos += formatWidth;
                }
            }

            return(dstBitmap);
        }