DOBON.NET DOBON.NETプログラミング掲示板過去ログ

画像表示

  • 題名: 画像表示
  • 著者: えほば
  • 日時: 2006/07/21 22:01:10
  • ID: 16779
  • この記事の返信元:
    • (なし)
  • この記事への返信:
  • ツリーを表示
環境/言語:[XP C# Framework1.1 VS2003]
分類:[.NET]

はじめまして。

サムネイルの表示ですが、Thumbs.dbに格納されている縮小画像を使用してピクチャーボックスなどに表示する事は可能なのでしょうか?

可能であれば、参考になるサイトが有れば、お教えください。

よろしくお願いします。
  • 題名: Re[1]: 画像表示
  • 著者: みーしん
  • 日時: 2006/07/21 23:54:03
  • ID: 16780
  • この記事の返信元:
  • この記事への返信:
  • ツリーを表示
■No16779に返信(えほばさんの記事)
> はじめまして。
>
> サムネイルの表示ですが、Thumbs.dbに格納されている縮小画像を使用してピクチャーボックスなどに表示する事は可能なのでしょうか?
>
> 可能であれば、参考になるサイトが有れば、お教えください。
>
> よろしくお願いします。

昔、画像を早く表示できないかなと思い、実験的に試した事があります。

Thumbs.dbをバイト配列で読み込んで。
マーカーの内容を調べてからメモリストリームオブジェクトを作成し。
それをBitmaオブジェクトにしたら表示できました。

hFFD8(最初) hFFD9(終わり)
JFIF形式のマーカーの研究をすると分かると思います。
でも、サムネイル画像を表示すると、画像が荒かった覚えがあります。
みーしんさん、有難う御座います。早速やってみたのですが、@で「使用されたパラメータが無効です」と例外がでて動いてくれません。原因がわかるようでしたら、ご教授お願い致します。

よろしくお願いします。

long StartPoint = //あらかじめ調べて置いた画像の開始点
long FinishPoint = //あらかじめ調べて置いた画像の終了点
long Count = FinishPoint - StartPoint;

#region バイト配列からメモリーストリームへの変換
FileStream fsData = new FileStream(txtAdress.Text,System.IO.FileMode.Open, System.IO.FileAccess.Read);
byte[] ByteArray = new byte[Count]; //バイト型配列を作成する
fsData.Read(ByteArray, 0 , (int)Count); //ファイルの内容を読み込む

MemoryStream ms = new MemoryStream();
ms.Write(ByteArray, 0, ByteArray.Length);
ms.SetLength(ByteArray.Length);
fsData.Close();
#endregion

Bitmap ImageData = new Bitmap(ms);  ※-- @ --※
Graphics g= picView.CreateGraphics();

//画像の描画
※省略※
2006/07/22(Sat) 12:05:26 編集(投稿者)
2006/07/22(Sat) 11:51:39 編集(投稿者)
2006/07/22(Sat) 11:33:32 編集(投稿者)

■No16781に返信(えほばさんの記事)
> みーしんさん、有難う御座います。早速やってみたのですが、@で「使用されたパラメータが無効です」と例外がでて動いてくれません。原因がわかるようでしたら、ご教授お願い致します。
>
> よろしくお願いします。
>
以前試したと言うのは、Exifファイル等のメタデーターなどを取り出すもので
データを検索して、ある文字が見つかったら決められたバイト数で取り出すなど
複雑なものでした。

単純に試してみるのなら。
Thumbs.dbファイルをバイナリーエディター等で開いて

FFD8(2バイト)と書かれている部分のアドレスから
FFD9(2バイトと書かれている部分までのアドレスの長さを調べてみて。

FFD8からFFD9までの開始位置と長さを指定してMemoryStreamを作成する必要が
あります。
MemoryStreamで設定する数値はIntegerだったので、アドレスを10進数に
直したりする必要はあります。

簡単に言ってしまうと、これでExif形式などのサムネイル画像も取り出す事ができます。

Thumbs.dbはOSの方で作成しないよう設定できたり、品質の設定が出来たり、
以前試した時に、画像が出来てない時もあった記憶があります。

バイト配列でファイルを読むのはかなり大きなファイルでも早いので
一応全部読み込んでCloseして

MemoryStream ms = new MemoryStream(バイト配列、開始位置、長さ); ←ここで設定
Bitmap ImageData = new Bitmap(ms);  
Graphics g= picView.CreateGraphics();

こういう設定にしたほうが良いでしょう。
2006/07/22(Sat) 12:25:00 編集(投稿者)

FileStream fsData = new FileStream(txtAdress.Text,System.IO.FileMode.Open, System.IO.FileAccess.Read);
byte[] ByteArray = new byte[fsData.Length];
fsData.Read(ByteArray, 0, ByteArray.Length);

>FFD8(2バイト)と書かれている部分のアドレスから
>FFD9(2バイトと書かれている部分までのアドレスの長さを調べてみて。

ByteArrayをウオッチで見た時のインデックスの事でいいんでしょうか?
現在開始と終わり以下のコードで調べてます。

for(int y=0 ; y < ByteArray.Length ; y++)
{
//バイトデータを16進数文字列に変換
string a = System.Convert.ToInt32(ByteArray[y] ).ToString("X");
string b = System.Convert.ToInt32(ByteArray[y+1] ).ToString("X");

if(a+b == "FFD8")
{ int Start_Point = y; }
if(a+b == "FFD9")
{ int Finish_Point = y+1; **開始と終点をリストボックスに追加**; }
}

リストボックスに追加した開始・終点から長さを取得して、メモリーストリームを作成してみましたが、やはり@でパラメータが無効みたいです。
int Count = Finish_Point - Start_Point;
MemoryStream ms = new MemoryStream(ByteArray , Start_Point , Count);
Bitmap ImageData = new Bitmap(ms); ※ @ ※
  • 題名: Re[5]: 画像表示
  • 著者: えほば
  • 日時: 2006/07/22 12:46:33
  • ID: 16784
  • この記事の返信元:
  • この記事への返信:
    • (なし)
  • ツリーを表示
ごめんなさい、一応動くのは動くみたいでなのですが、

FFD8,FFD9をリストボックスに追加していってますが、画像を表示してくれる物と表示出来ない物があるみたいです。表示出来ない時はパラメータが無効です、とエラー表示されてます。
  • 題名: Re[1]: 画像表示
  • 著者: 管理人
  • URL: http://dobon.net/
  • 日時: 2006/07/27 2:42:29
  • ID: 16854
  • この記事の返信元:
  • この記事への返信:
    • (なし)
  • ツリーを表示
■No16779に返信(えほばさんの記事)
> サムネイルの表示ですが、Thumbs.dbに格納されている縮小画像を使用してピクチャーボックスなどに表示する事は可能なのでしょうか?

ちょっと調べてみて、参考になりそうなページを紹介します。どうでしょうか?

http://groups.google.co.jp/group/microsoft.public.dotnet.languages.csharp/msg/81379e1a57db6619?hl=ja&

C++ですが...。
http://netez.com/2xExplorer/shellFAQ/bas_infos.html#thumb

こちらはC#です。
http://www.vbaccelerator.com/home/net/code/libraries/Shell_Projects/Thumbnail_Extraction/article.asp

DOBON.NET | プログラミング道 | プログラミング掲示板