2010-10-08 112 views
0

我發現了一種在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

該代碼在C#/ .NET中不需要。 只需使用圖像類:

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

管理GDI +具有內置編碼器和支持以下文件類型的解碼器:

BMP 
GIF 
JPEG 
PNG 
TIFF 
+0

此代碼得到的圖像尺寸在milisecounds! – Ata 2010-10-08 09:45:35