Esempio n. 1
0
		private void LoadBitmap(Stream stream)
		{
			ValidateStream(stream);

			var reader = new BinaryReader(stream);

			// Read the header.
			_header = (TGA_HEADER)reader.ReadStruct(typeof(TGA_HEADER));


			/*long t = stream.Position;
			BinaryWriter wr = new BinaryWriter(stream, Encoding.ASCII);
			if (!header.HasColorMap)
			{
				header.colormaplength = 0;
				header.colormapstart = 0;
				stream.Position = 0;
				wr.WriteStruct(header);
			}*/
//			stream.Position = t;


			if (_header.identsize > 0)
			{
				var imageId = reader.ReadBytes(_header.identsize);
				Debug.WriteLine("Has ImageID: " + Encoding.ASCII.GetString(imageId));
			}

			// Check if we know the image data type.
			if (!Enum.IsDefined(typeof(TgaPixelFormat), PixelFormat)) throw new Exception("Unknown image data type.");

			// Check if color map is needed by data type and load it if available.
			var colorMap = new byte[0];
			if (PixelFormat == TgaPixelFormat.Indexed)
				if (!HasPalette)
					throw new Exception("No color map is defined.");
				else
					colorMap = reader.ReadBytes((PaletteBits / 8) * _header.colormaplength);

			// Check if file has footer
			var tempPos = stream.Position;
			stream.Seek(-26, SeekOrigin.End);
			var footer = (TGA_FOOTER)reader.ReadStruct(typeof(TGA_FOOTER));
			stream.Position = tempPos;

			_fileVersion = TgaFileVersion.Version1;
			if (footer.IsValidFooter)
				_fileVersion = TgaFileVersion.Version2;

			_bitmap = null;
			switch (_header.bits)
			{
				case 32:
					_bitmap = new Bitmap(Width, Height, System.Drawing.Imaging.PixelFormat.Format32bppArgb);
					break;
				case 24:
					_bitmap = new Bitmap(Width, Height, System.Drawing.Imaging.PixelFormat.Format24bppRgb);
					break;
				case 16:
					_bitmap = new Bitmap(Width, Height, System.Drawing.Imaging.PixelFormat.Format16bppRgb555);
					break;
				case 8:
					_bitmap = new Bitmap(Width, Height, System.Drawing.Imaging.PixelFormat.Format8bppIndexed);

					// Load palette from image data.
					if (HasPalette && PixelFormat == TgaPixelFormat.Indexed)
					{
						var bytesPerColor = PaletteBits / 8;
						for (var i = _header.colormapstart + bytesPerColor - 1; i < colorMap.Length; i += bytesPerColor)
						{
							var colorIndex = i/bytesPerColor;
							if (colorIndex < _bitmap.Palette.Entries.Length)
								_bitmap.Palette.Entries[colorIndex] = Color.FromArgb(colorMap[i], colorMap[i - 1], colorMap[i - 2]);
							else
								throw new Exception("Unexpected length of color palette.");
						}
					}
					else if (PixelFormat == TgaPixelFormat.Greyscale)
					{
						// Build a 256 color palette of grey colors.
						for (var i = 0; i < _bitmap.Palette.Entries.Length; i++)
							_bitmap.Palette.Entries[i] = Color.FromArgb(i, i, i);
					}
					break;
			}
			
			if (_bitmap == null)
				throw new NotSupportedException("The tga image format is not supported.");

			ReadPixels(_bitmap, 
				Compressed 
					? new TruevisionRleReader(reader.BaseStream, _bitmap.PixelFormat) 
					: reader,
				BottomToTop
			);


			if (_fileVersion == TgaFileVersion.Version2)
			{
				if (footer.developerDirectoryOffset > 0)
				{
					stream.Seek(footer.developerDirectoryOffset, SeekOrigin.Begin);
				}
				if (footer.extensionAreaOffset > 0)
				{
					//char[] trimChars = " \0".ToCharArray();

					stream.Seek(footer.extensionAreaOffset, SeekOrigin.Begin);
					var extension = (TGA_EXTENSION)reader.ReadStruct(typeof(TGA_EXTENSION));
//					Debug.WriteLine("Generated by software: " + extension.softwareID + " v." + (float)extension.softwareVersionNumber / 100);

				}
				var bytesToPreserve = reader.ReadBytes((int)(stream.Length - 26 - stream.Position));
//				Debug.WriteLine(System.Text.Encoding.ASCII.GetString(bytesToPreserve));
			}
		}
Esempio n. 2
0
        private void LoadBitmap(Stream stream)
        {
            ValidateStream(stream);

            var reader = new BinaryReader(stream);

            // Read the header.
            _header = (TGA_HEADER)reader.ReadStruct(typeof(TGA_HEADER));


            /*long t = stream.Position;
             * BinaryWriter wr = new BinaryWriter(stream, Encoding.ASCII);
             * if (!header.HasColorMap)
             * {
             *      header.colormaplength = 0;
             *      header.colormapstart = 0;
             *      stream.Position = 0;
             *      wr.WriteStruct(header);
             * }*/
//			stream.Position = t;


            if (_header.identsize > 0)
            {
                var imageId = reader.ReadBytes(_header.identsize);
                Debug.WriteLine("Has ImageID: " + Encoding.ASCII.GetString(imageId));
            }

            // Check if we know the image data type.
            if (!Enum.IsDefined(typeof(TgaPixelFormat), PixelFormat))
            {
                throw new Exception("Unknown image data type.");
            }

            // Check if color map is needed by data type and load it if available.
            var colorMap = new byte[0];

            if (PixelFormat == TgaPixelFormat.Indexed)
            {
                if (!HasPalette)
                {
                    throw new Exception("No color map is defined.");
                }
                else
                {
                    colorMap = reader.ReadBytes((PaletteBits / 8) * _header.colormaplength);
                }
            }

            // Check if file has footer
            var tempPos = stream.Position;

            stream.Seek(-26, SeekOrigin.End);
            var footer = (TGA_FOOTER)reader.ReadStruct(typeof(TGA_FOOTER));

            stream.Position = tempPos;

            _fileVersion = TgaFileVersion.Version1;
            if (footer.IsValidFooter)
            {
                _fileVersion = TgaFileVersion.Version2;
            }

            _bitmap = null;
            switch (_header.bits)
            {
            case 32:
                _bitmap = new Bitmap(Width, Height, System.Drawing.Imaging.PixelFormat.Format32bppArgb);
                break;

            case 24:
                _bitmap = new Bitmap(Width, Height, System.Drawing.Imaging.PixelFormat.Format24bppRgb);
                break;

            case 16:
                _bitmap = new Bitmap(Width, Height, System.Drawing.Imaging.PixelFormat.Format16bppRgb555);
                break;

            case 8:
                _bitmap = new Bitmap(Width, Height, System.Drawing.Imaging.PixelFormat.Format8bppIndexed);

                // Load palette from image data.
                if (HasPalette && PixelFormat == TgaPixelFormat.Indexed)
                {
                    var bytesPerColor = PaletteBits / 8;
                    for (var i = _header.colormapstart + bytesPerColor - 1; i < colorMap.Length; i += bytesPerColor)
                    {
                        var colorIndex = i / bytesPerColor;
                        if (colorIndex < _bitmap.Palette.Entries.Length)
                        {
                            _bitmap.Palette.Entries[colorIndex] = Color.FromArgb(colorMap[i], colorMap[i - 1], colorMap[i - 2]);
                        }
                        else
                        {
                            throw new Exception("Unexpected length of color palette.");
                        }
                    }
                }
                else if (PixelFormat == TgaPixelFormat.Greyscale)
                {
                    // Build a 256 color palette of grey colors.
                    for (var i = 0; i < _bitmap.Palette.Entries.Length; i++)
                    {
                        _bitmap.Palette.Entries[i] = Color.FromArgb(i, i, i);
                    }
                }
                break;
            }

            if (_bitmap == null)
            {
                throw new NotSupportedException("The tga image format is not supported.");
            }

            ReadPixels(_bitmap,
                       Compressed
                                        ? new TruevisionRleReader(reader.BaseStream, _bitmap.PixelFormat)
                                        : reader,
                       BottomToTop
                       );


            if (_fileVersion == TgaFileVersion.Version2)
            {
                if (footer.developerDirectoryOffset > 0)
                {
                    stream.Seek(footer.developerDirectoryOffset, SeekOrigin.Begin);
                }
                if (footer.extensionAreaOffset > 0)
                {
                    //char[] trimChars = " \0".ToCharArray();

                    stream.Seek(footer.extensionAreaOffset, SeekOrigin.Begin);
                    var extension = (TGA_EXTENSION)reader.ReadStruct(typeof(TGA_EXTENSION));
//					Debug.WriteLine("Generated by software: " + extension.softwareID + " v." + (float)extension.softwareVersionNumber / 100);
                }
                var bytesToPreserve = reader.ReadBytes((int)(stream.Length - 26 - stream.Position));
//				Debug.WriteLine(System.Text.Encoding.ASCII.GetString(bytesToPreserve));
            }
        }