/// <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]; }
/// <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); }