获得图像大小

时间:2010-10-08 09:36:18

标签: c#

我找到了一种在C#中查找图像大小的好方法,但代码是为.net 3.5构建的,我想用于.net 2.0。

有没有像这里的任何方式或任何.net代码吗?

public static class ImageHelper
 {
     const string errorMessage = "Could not recognise image format.";
     private static Dictionary<byte[], Func<BinaryReader, Size>> imageFormatDecoders = new Dictionary<byte[], Func<BinaryReader, Size>>()
 {
     { new byte[]{ 0x42, 0x4D }, DecodeBitmap},
     { new byte[]{ 0x47, 0x49, 0x46, 0x38, 0x37, 0x61 }, DecodeGif },
     { new byte[]{ 0x47, 0x49, 0x46, 0x38, 0x39, 0x61 }, DecodeGif },
     { new byte[]{ 0x89, 0x50, 0x4E, 0x47, 0x0D, 0x0A, 0x1A, 0x0A }, DecodePng },
     { new byte[]{ 0xff, 0xd8 }, DecodeJfif },
 };
     /// <summary>
     /// Gets the dimensions of an image.
     /// </summary>
     /// <param name="path">The path of the image to get the dimensions of.</param>
     /// <returns>The dimensions of the specified image.</returns>
     /// <exception cref="ArgumentException">The image was of an unrecognised format.</exception>
     public static Size GetDimensions(string path)
     {
         using (BinaryReader binaryReader = new BinaryReader(File.OpenRead(path)))
         {
             try
             {
                 return GetDimensions(binaryReader);
             }
             catch (ArgumentException e)
             {
                 if (e.Message.StartsWith(errorMessage))
                 {
                     throw new ArgumentException(errorMessage, "path", e);
                 }
                 else
                 {
                     throw e;
                 }
             }
         }
     }
     /// <summary>
     /// Gets the dimensions of an image.
     /// </summary>
     /// <param name="path">The path of the image to get the dimensions of.</param>
     /// <returns>The dimensions of the specified image.</returns>
     /// <exception cref="ArgumentException">The image was of an unrecognised format.</exception>
     public static Size GetDimensions(BinaryReader binaryReader)
     {
         int maxMagicBytesLength = imageFormatDecoders.Keys.OrderByDescending(x => x.Length).First().Length;
         byte[] magicBytes = new byte[maxMagicBytesLength];
         for (int i = 0; i < maxMagicBytesLength; i += 1)
         {
             magicBytes[i] = binaryReader.ReadByte();
             foreach (var kvPair in imageFormatDecoders)
             {
                 if (magicBytes.StartsWith(kvPair.Key))
                 {
                     return kvPair.Value(binaryReader);
                 }
             }
         }
         throw new ArgumentException(errorMessage, "binaryReader");
     }
     private static bool StartsWith(this byte[] thisBytes, byte[] thatBytes)
     {
         for (int i = 0; i < thatBytes.Length; i += 1)
         {
             if (thisBytes[i] != thatBytes[i])
             {
                 return false;
             }
         }
         return true;
     }
     private static short ReadLittleEndianInt16(this BinaryReader binaryReader)
     {
         byte[] bytes = new byte[sizeof(short)];
         for (int i = 0; i < sizeof(short); i += 1)
         {
             bytes[sizeof(short) - 1 - i] = binaryReader.ReadByte();
         }
         return BitConverter.ToInt16(bytes, 0);
     }
     private static int ReadLittleEndianInt32(this BinaryReader binaryReader)
     {
         byte[] bytes = new byte[sizeof(int)];
         for (int i = 0; i < sizeof(int); i += 1)
         {
             bytes[sizeof(int) - 1 - i] = binaryReader.ReadByte();
         }
         return BitConverter.ToInt32(bytes, 0);
     }
     private static Size DecodeBitmap(BinaryReader binaryReader)
     {
         binaryReader.ReadBytes(16);
         int width = binaryReader.ReadInt32();
         int height = binaryReader.ReadInt32();
         return new Size(width, height);
     }
     private static Size DecodeGif(BinaryReader binaryReader)
     {
         int width = binaryReader.ReadInt16();
         int height = binaryReader.ReadInt16();
         return new Size(width, height);
     }
     private static Size DecodePng(BinaryReader binaryReader)
     {
         binaryReader.ReadBytes(8);
         int width = binaryReader.ReadLittleEndianInt32();
         int height = binaryReader.ReadLittleEndianInt32();
         return new Size(width, height);
     }
     private static Size DecodeJfif(BinaryReader binaryReader)
     {
         while (binaryReader.ReadByte() == 0xff)
         {
             byte marker = binaryReader.ReadByte();
             short chunkLength = binaryReader.ReadLittleEndianInt16();
             if (marker == 0xc0)
             {
                 binaryReader.ReadByte();
                 int height = binaryReader.ReadLittleEndianInt16();
                 int width = binaryReader.ReadLittleEndianInt16();
                 return new Size(width, height);
             }
             binaryReader.ReadBytes(chunkLength - 2);
         }
         throw new ArgumentException(errorMessage);
     }
 }

1 个答案:

答案 0 :(得分:1)

C#/ .NET中不需要该代码。 只需使用Image类:

Image newImage = Image.FromFile("SampImag.jpg");
newImage.Size();

托管GDI +具有支持以下文件类型的内置编码器和解码器:

BMP
GIF
JPEG
PNG
TIFF