Ejemplo n.º 1
0
        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));
                }
            }
        }
Ejemplo n.º 2
0
        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);
        }
Ejemplo n.º 3
0
 public ImageInformation(TxfHeader pixelDataHeader, TxfHeader paletteHeader, Bitmap bitmap)
 {
     PixelDataHeader   = pixelDataHeader;
     PaletteDataHeader = paletteHeader;
     Bitmap            = bitmap;
 }