Exemple #1
0
        private Bitmap Leer()
        {
            Bitmap imagen;

            BinaryReader br = new BinaryReader(File.OpenRead(archivo));
            sTGA tga = new sTGA();

            // Lee la cabecera
            tga.header.image_id_length = br.ReadByte();
            tga.header.colorMap = br.ReadBoolean();
            #region Image Type
            switch (br.ReadByte())
            {
                case 0x00:
                    tga.header.image_type = ImageType.none;
                    break;
                case 0x01:
                    tga.header.image_type = ImageType.Uncompressed_ColorMapped;
                    break;
                case 0x02:
                    tga.header.image_type = ImageType.Uncompressed_TrueColor;
                    break;
                case 0x03:
                    tga.header.image_type = ImageType.Uncompressed_BlackWhite;
                    break;
                case 0x09:
                    tga.header.image_type = ImageType.RLE_ColorMapped;
                    break;
                case 0x0A:
                    tga.header.image_type = ImageType.RLE_TrueColor;
                    break;
                case 0x0B:
                    tga.header.image_type = ImageType.RLE_BlackWhite;
                    break;
                default:
                    tga.header.image_type = ImageType.noSopported;
                    break;
            }
            #endregion
            tga.header.colorMap_spec.first_entry_index = br.ReadUInt16();
            tga.header.colorMap_spec.length = br.ReadUInt16();
            tga.header.colorMap_spec.entry_size = br.ReadByte();
            tga.header.image_spec.posX = br.ReadUInt16();
            tga.header.image_spec.posY = br.ReadUInt16();
            tga.header.image_spec.width = br.ReadUInt16();
            tga.header.image_spec.height = br.ReadUInt16();
            tga.header.image_spec.depth = br.ReadByte();
            tga.header.image_spec.descriptor = br.ReadByte();
            tga.imageData.image_id = new String(br.ReadChars(tga.header.image_id_length));
            if (tga.header.colorMap)
            {
                tga.imageData.colorMap = new Color[tga.header.colorMap_spec.length / (tga.header.colorMap_spec.entry_size / 8)];
                switch (tga.header.colorMap_spec.entry_size)
                {
                    case 24:
                        for (int c = 0; c < tga.imageData.colorMap.Length; c++)
                        {
                            Color newColor = Color.FromArgb(br.ReadByte(), br.ReadByte(), br.ReadByte());
                            tga.imageData.colorMap[c] = newColor;
                        }
                        br.ReadBytes(tga.header.colorMap_spec.length - tga.imageData.colorMap.Length * 3);
                        break;
                }
            }
            imagen = new Bitmap(tga.header.image_spec.width, tga.header.image_spec.height);
            #region Obtener colores de pixels
            Color[] colores = new Color[tga.header.image_spec.height * tga.header.image_spec.width];
            int i = 0;
            switch (tga.header.image_type)
            {

                case TGA.ImageType.RLE_TrueColor:
                    // Primero descomprimimos
                    long pos = br.BaseStream.Position;
                    br.Close();
                    tga.imageData.image = RLE.Descomprimir_Pixel(archivo, ref pos, tga.header.image_spec.depth,
                                                          tga.header.image_spec.width, tga.header.image_spec.height);
                    br = new BinaryReader(File.OpenRead(archivo));
                    br.BaseStream.Position = pos;
                    // Luego convertimos los colores
                    for (int j = 0; j < colores.Length; j++)
                    {
                        if (tga.header.image_spec.depth == 0x20)
                            colores[j] = Color.FromArgb(tga.imageData.image[4 * j + 3], tga.imageData.image[4 * j],
                                                        tga.imageData.image[4 * j + 1], tga.imageData.image[4 * j + 2]);

                        else
                            colores[j] = Color.FromArgb(255, tga.imageData.image[3 * j],
                                                        tga.imageData.image[3 * j + 1], tga.imageData.image[3 * j + 2]);
                    }
                    // Set pixels colors
                    for (int y = tga.header.image_spec.height - 1; y > 0; y--)
                    {
                        for (int x = 0; x < tga.header.image_spec.width; x++)
                        {
                            imagen.SetPixel(x, y, colores[i]);
                            i++;
                        }
                    }
                    break;

                case TGA.ImageType.Uncompressed_TrueColor:
                    colores = Actions.BGR555ToColor(br.ReadBytes(tga.header.image_spec.height * tga.header.image_spec.width * 2));
                    for (int y = tga.header.image_spec.height - 1; y > 0; y--)
                    {
                        for (int x = 0; x < tga.header.image_spec.width; x++)
                        {
                            imagen.SetPixel(x, y, colores[i]);
                            i++;
                        }
                    }

                    break;

                case TGA.ImageType.Uncompressed_ColorMapped:
                    for (int y = 0; y < tga.header.image_spec.height; y++)
                    {
                        for (int x = 0; x < tga.header.image_spec.width; x++)
                        {
                            imagen.SetPixel(x, y, tga.imageData.colorMap[br.ReadByte()]);
                            i++;
                        }
                    }
                    break;
                case TGA.ImageType.Uncompressed_BlackWhite:
                case TGA.ImageType.RLE_BlackWhite:
                case TGA.ImageType.RLE_ColorMapped:
                case TGA.ImageType.noSopported:
                default:
                    throw new Exception("Invalid value for ImageType");
            }
            #endregion

            br.Close();
            return imagen;
        }
Exemple #2
0
        private Bitmap Leer()
        {
            Bitmap imagen;

            BinaryReader br  = new BinaryReader(File.OpenRead(archivo));
            sTGA         tga = new sTGA();

            // Lee la cabecera
            tga.header.image_id_length = br.ReadByte();
            tga.header.colorMap        = br.ReadBoolean();
            #region Image Type
            switch (br.ReadByte())
            {
            case 0x00:
                tga.header.image_type = ImageType.none;
                break;

            case 0x01:
                tga.header.image_type = ImageType.Uncompressed_ColorMapped;
                break;

            case 0x02:
                tga.header.image_type = ImageType.Uncompressed_TrueColor;
                break;

            case 0x03:
                tga.header.image_type = ImageType.Uncompressed_BlackWhite;
                break;

            case 0x09:
                tga.header.image_type = ImageType.RLE_ColorMapped;
                break;

            case 0x0A:
                tga.header.image_type = ImageType.RLE_TrueColor;
                break;

            case 0x0B:
                tga.header.image_type = ImageType.RLE_BlackWhite;
                break;

            default:
                tga.header.image_type = ImageType.noSopported;
                break;
            }
            #endregion
            tga.header.colorMap_spec.first_entry_index = br.ReadUInt16();
            tga.header.colorMap_spec.length            = br.ReadUInt16();
            tga.header.colorMap_spec.entry_size        = br.ReadByte();
            tga.header.image_spec.posX       = br.ReadUInt16();
            tga.header.image_spec.posY       = br.ReadUInt16();
            tga.header.image_spec.width      = br.ReadUInt16();
            tga.header.image_spec.height     = br.ReadUInt16();
            tga.header.image_spec.depth      = br.ReadByte();
            tga.header.image_spec.descriptor = br.ReadByte();
            tga.imageData.image_id           = new String(br.ReadChars(tga.header.image_id_length));
            if (tga.header.colorMap)
            {
                tga.imageData.colorMap = new Color[tga.header.colorMap_spec.length / (tga.header.colorMap_spec.entry_size / 8)];
                switch (tga.header.colorMap_spec.entry_size)
                {
                case 24:
                    for (int c = 0; c < tga.imageData.colorMap.Length; c++)
                    {
                        Color newColor = Color.FromArgb(br.ReadByte(), br.ReadByte(), br.ReadByte());
                        tga.imageData.colorMap[c] = newColor;
                    }
                    br.ReadBytes(tga.header.colorMap_spec.length - tga.imageData.colorMap.Length * 3);
                    break;
                }
            }
            imagen = new Bitmap(tga.header.image_spec.width, tga.header.image_spec.height);
            #region Obtener colores de pixels
            Color[] colores = new Color[tga.header.image_spec.height * tga.header.image_spec.width];
            int     i       = 0;
            switch (tga.header.image_type)
            {
            case TGA.ImageType.RLE_TrueColor:
                // Primero descomprimimos
                long pos = br.BaseStream.Position;
                br.Close();
                tga.imageData.image = RLE.Descomprimir_Pixel(archivo, ref pos, tga.header.image_spec.depth,
                                                             tga.header.image_spec.width, tga.header.image_spec.height);
                br = new BinaryReader(File.OpenRead(archivo));
                br.BaseStream.Position = pos;
                // Luego convertimos los colores
                for (int j = 0; j < colores.Length; j++)
                {
                    if (tga.header.image_spec.depth == 0x20)
                    {
                        colores[j] = Color.FromArgb(tga.imageData.image[4 * j + 3], tga.imageData.image[4 * j],
                                                    tga.imageData.image[4 * j + 1], tga.imageData.image[4 * j + 2]);
                    }

                    else
                    {
                        colores[j] = Color.FromArgb(255, tga.imageData.image[3 * j],
                                                    tga.imageData.image[3 * j + 1], tga.imageData.image[3 * j + 2]);
                    }
                }
                // Set pixels colors
                for (int y = tga.header.image_spec.height - 1; y > 0; y--)
                {
                    for (int x = 0; x < tga.header.image_spec.width; x++)
                    {
                        imagen.SetPixel(x, y, colores[i]);
                        i++;
                    }
                }
                break;

            case TGA.ImageType.Uncompressed_TrueColor:
                colores = Actions.BGR555ToColor(br.ReadBytes(tga.header.image_spec.height * tga.header.image_spec.width * 2));
                for (int y = tga.header.image_spec.height - 1; y > 0; y--)
                {
                    for (int x = 0; x < tga.header.image_spec.width; x++)
                    {
                        imagen.SetPixel(x, y, colores[i]);
                        i++;
                    }
                }

                break;

            case TGA.ImageType.Uncompressed_ColorMapped:
                for (int y = 0; y < tga.header.image_spec.height; y++)
                {
                    for (int x = 0; x < tga.header.image_spec.width; x++)
                    {
                        imagen.SetPixel(x, y, tga.imageData.colorMap[br.ReadByte()]);
                        i++;
                    }
                }
                break;

            case TGA.ImageType.Uncompressed_BlackWhite:
            case TGA.ImageType.RLE_BlackWhite:
            case TGA.ImageType.RLE_ColorMapped:
            case TGA.ImageType.noSopported:
            default:
                throw new Exception("Invalid value for ImageType");
            }
            #endregion

            br.Close();
            return(imagen);
        }