WP TIPS に戻る

JPEG の画像サイズを知る

サンプルプロジェクト Image_get_jpegsize.zip

WP7 では、2048px を超える UIElement の表示は出来ません。
例えば 2048×2048ピクセル以上の画像を Image や BitmapImage に読み込むと、読み込まれた時点でオートダウンサンプリング(自動的に縮小)されてしまいます。(ちなみに TextBlock に長文テキストを表示すると、2048px 以降の文字がぶっちぎれます)
オートダウンサンプリングされてしまうと言うことは、元々の画像サイズが分からないと言うことです。

Image_get_jpegsize-01.png

何らかの事情で元々の画像サイズが必要な場合は、@7shi さんが公開されている方法で JPEG ファイルそのものを解析してサイズを取得しましょう。

// 
// 七誌さんのコードを IsolatedStorage に対応させた
// http://d.hatena.ne.jp/n7shi/searchdiary?word=%2A%5BJPEG%5D
// 
public static Size GetJpegSize(string jpg)
{
   using (IsolatedStorageFile iso = IsolatedStorageFile.GetUserStoreForApplication())
   {
       using (var stream = iso.OpenFile(jpg, FileMode.Open))
       {
           return GetJpegSIze(stream);
       }
   }
}

public static Size GetJpegSIze(Stream stream)
{
   var buf = new byte[8];
   while (stream.Read(buf, 0, 2) == 2 && buf[0] == 0xff)
   {
       if (buf[1] == 0xc0 && stream.Read(buf, 0, 7) == 7)
           return new Size(buf[5] * 256 + buf[6], buf[3] * 256 + buf[4]);
       else if (buf[1] != 0xd8)
       {
           if (stream.Read(buf, 0, 2) == 2)
               stream.Position += buf[0] * 256 + buf[1] - 2;
           else
               break;
       }
   }

   return Size.Empty;
}

参照