public ImageInformation GetImageInformation(TxfHeader pixelDataHeader, TxfHeader paletteDataHeader) { ImageInformation image = Images.FirstOrDefault(x => x.PixelDataHeader == pixelDataHeader && x.PaletteDataHeader == paletteDataHeader); if (image != null) { return(image); } using (MemoryStream tempStream = new MemoryStream(rawData.ToArray())) { using (EndianBinaryReader tempReader = new EndianBinaryReader(tempStream, Endian.BigEndian)) { return(ConvertImage(tempReader, pixelDataHeader, paletteDataHeader)); } } }
private ImageInformation ConvertImage(EndianBinaryReader reader, TxfHeader pixelDataHeader, TxfHeader paletteDataHeader) { PixelFormat pixelFormat; byte[] pixelData = null, paletteData = null; long pixelDataOffset = -1, paletteDataOffset = -1; /* Seek to the beginning of the pixel data block */ pixelDataOffset = (StartPosition + (PixelDataHeaders.Count * TxfHeader.Size) + (PaletteDataHeaders.Count * TxfHeader.Size) + (pixelDataHeader.IsIndexedImage ? pixelDataHeader.Offset : 0)); reader.BaseStream.Seek(pixelDataOffset, SeekOrigin.Begin); /* Determine pixel format & read/convert pixel data */ switch (pixelDataHeader.Format) { case TxfDataFormat.Argb8888: { pixelFormat = PixelFormat.Format32bppArgb; pixelData = GetPixelData(reader, pixelDataHeader.Format, CalculatePixelDataSize(pixelDataHeader.Format, pixelDataHeader.Width, pixelDataHeader.Height)); } break; case TxfDataFormat.RgbaDxt1: case TxfDataFormat.RgbaDxt3: case TxfDataFormat.RgbaDxt5: { pixelFormat = PixelFormat.Format32bppArgb; pixelData = DecompressDxt(reader, pixelDataHeader.Format, pixelDataHeader.Width, pixelDataHeader.Height); } break; case TxfDataFormat.Indexed8bpp: { pixelFormat = PixelFormat.Format8bppIndexed; pixelData = GetPixelData(reader, pixelDataHeader.Format, CalculatePixelDataSize(pixelDataHeader.Format, pixelDataHeader.Width, pixelDataHeader.Height)); } break; case TxfDataFormat.Argb1555: { pixelFormat = PixelFormat.Format16bppArgb1555; pixelData = GetPixelData(reader, pixelDataHeader.Format, pixelDataHeader.Offset); } break; case TxfDataFormat.Argb4444: { pixelFormat = PixelFormat.Format32bppArgb; byte[] tempData = GetPixelData(reader, pixelDataHeader.Format, CalculatePixelDataSize(pixelDataHeader.Format, pixelDataHeader.Width, pixelDataHeader.Height)); pixelData = new byte[tempData.Length << 1]; for (int i = 0, j = 0; i < tempData.Length; i += 2, j += 4) { pixelData[j + 0] = (byte)((tempData[i] & 0x0F) | ((tempData[i] & 0x0F) << 4)); pixelData[j + 1] = (byte)((tempData[i] & 0xF0) | ((tempData[i] & 0xF0) >> 4)); pixelData[j + 2] = (byte)((tempData[i + 1] & 0x0F) | ((tempData[i + 1] & 0x0F) << 4)); pixelData[j + 3] = (byte)((tempData[i + 1] & 0xF0) | ((tempData[i + 1] & 0xF0) >> 4)); } } break; case TxfDataFormat.Rgb565: { pixelFormat = PixelFormat.Format16bppRgb565; pixelData = GetPixelData(reader, pixelDataHeader.Format, pixelDataHeader.Offset); } break; default: throw new Exception("Unsupported pixel data format."); } /* If we were given a palette data block header, seek to & read the palette data, too! */ if (paletteDataHeader != null) { paletteDataOffset = StartPosition + (PixelDataHeaders.Count * TxfHeader.Size) + (PaletteDataHeaders.Count * TxfHeader.Size) + paletteDataHeader.Offset; reader.BaseStream.Seek(paletteDataOffset, SeekOrigin.Begin); paletteData = GetPixelData(reader, paletteDataHeader.Format, CalculatePaletteDataSize(pixelDataHeader.Format, paletteDataHeader.Format)); } /* Generate the final bitmap */ Bitmap bitmap = new Bitmap(pixelDataHeader.Width, pixelDataHeader.Height, pixelFormat); BitmapData bmpData = bitmap.LockBits(new Rectangle(0, 0, bitmap.Width, bitmap.Height), ImageLockMode.WriteOnly, bitmap.PixelFormat); Marshal.Copy(pixelData, 0, bmpData.Scan0, pixelData.Length); bitmap.UnlockBits(bmpData); /* Apply palette if necessary */ if (paletteDataHeader != null && paletteData != null) { ApplyColorPalette(bitmap, paletteData, paletteDataHeader.Format); } ImageInformation imageInfos = new ImageInformation(pixelDataHeader, paletteDataHeader, bitmap) { ImageOffset = pixelDataOffset, PaletteOffset = paletteDataOffset }; Images.Add(imageInfos); return(imageInfos); }
public ImageInformation(TxfHeader pixelDataHeader, TxfHeader paletteHeader, Bitmap bitmap) { PixelDataHeader = pixelDataHeader; PaletteDataHeader = paletteHeader; Bitmap = bitmap; }