C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[8]: 画像の表示


(過去ログ 44 を表示中)

[トピック内 17 記事 (1 - 17 表示)]  << 0 >>

■22767 / inTopicNo.1)  画像の表示
  
□投稿者/ 渡り鳥 (1回)-(2008/07/31(Thu) 18:03:39)

分類:[C#] 

【環境】
 OS:WindowsVISTA
 言語:MicrosoftVisualStudio 2005 C#

やりたいことといたしましては、BitmapSourceに画像データを入れたあと、PictureBoxに表示したいのですが
型 'type1' を 'type2' に暗黙的に変換できません。明示的な変換が存在します。(cast が不足していないかどうかを確認してください) 
というコンパイルエラーが発生します。

PictureBox.Image=(System.Drawing.Image)type1 と修正して実行したところ
型 'System.Windows.Controls.Image' のオブジェクトを型 'System.Drawing.Image' にキャストできません。
というコンパイルエラーが発生してしまいます。

何か良い方法などございましたらご教授お願いいたします。
引用返信 編集キー/
■22770 / inTopicNo.2)  Re[1]: 画像の表示
□投稿者/ オショウ (26回)-(2008/07/31(Thu) 18:31:33)
No22767 (渡り鳥 さん) に返信
> 何か良い方法などございましたらご教授お願いいたします。

  http://dobon.net/vb/dotnet/index.html#graphics

  ここのTipsをご参照下さい。

以上。
引用返信 編集キー/
■22775 / inTopicNo.3)  Re[2]: 画像の表示
□投稿者/ 渡り鳥 (3回)-(2008/07/31(Thu) 19:49:40)
No22770 (オショウ さん) に返信
>   http://dobon.net/vb/dotnet/index.html#graphics
> 
>   ここのTipsをご参照下さい。
> 
> 以上。

早速のご返信ありがとうございます。
拝見させて頂いたところ、私がやりたいことと少々違いましたのでソースコードを掲載させていただきます。

using System;
using System.Drawing;
using System.Windows.Forms;
using System.Windows.Media.Imaging;
using System.IO;
using System.Windows;

namespace createWindowContent
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void button1_Click(object sender, EventArgs e)
        {
            try
            {
                pictureBox1.Image = (System.Drawing.Image)OpenCR2();
            }
            catch
            {
                System.Windows.Forms.MessageBox.Show("描画できません。");
            }
        }

        static object OpenCR2()
        {
            FileStream fs = new FileStream(@"C:\test\IMG_0001.CR2", FileMode.Open, FileAccess.Read, FileShare.Read);
            BitmapDecoder bd = BitmapDecoder.Create(fs, BitmapCreateOptions.PreservePixelFormat, BitmapCacheOption.Default);
            BitmapSource bs = bd.Frames[0];

            return bs;
        }
    }
}

拡張子の『*.CR2』はCanon製品のカメラで撮影した画像の拡張子です。

再度よろしくお願いいたします。

引用返信 編集キー/
■22777 / inTopicNo.4)  Re[3]: 画像の表示
□投稿者/ Hongliang (287回)-(2008/07/31(Thu) 21:25:34)
2008/07/31(Thu) 21:27:31 編集(投稿者)

WinForms を使う場合、グラフィック関連の操作は一般的に System.Drawing 以下の名前空間のクラスを使用します。PictureBox の Image プロパティも、System.Drawing.Image 型になっていますよね?(MSDN でご確認ください)
System.Windows.Forms 以下を除く System.Windows 以下の名前空間は、一般的に WPF アプリケーションのために用意されています。WinForms で System.Windows.Media.Imaging のクラス使用もやってやれないことはないですが大変面倒です。

まずはこの Image プロパティの型である System.Drawing.Image をお調べください。

// でも cr2 なんて拡張子からするとキャノンの独自 RAW 形式っぽいから GDI+ じゃロードできなさそうだなぁ。多分 WPF でも扱えないだろうなぁ。
引用返信 編集キー/
■22781 / inTopicNo.5)  Re[3]: 画像の表示
□投稿者/ オショウ (27回)-(2008/07/31(Thu) 23:39:41)
No22775 (渡り鳥 さん) に返信
>
> 拡張子の『*.CR2』はCanon製品のカメラで撮影した画像の拡張子です。

  そういうことは『最初』に書いておくことだよ!

  で、結論から・・・CR2画像ファイルの展開ができないことには
  無理。

  キャノンからCR2ファイルの形式の公表が無い限り、できません。

※ どこかにCR2フォーマットのファイル情報があれば、ご自信で、
  DIBかBMPに変換するコーディングを書いてからPictureBox
  に読み込めること(表示)ができるようになります。

● 逃げ手として・・・

  CR2ファイルを表示するビューワに表示させ、ウィンドウハンドル
  からカットアンドペースト(クリップボード経由)で、自身のPictureBox
  に張り込むとか・・・

以上。
引用返信 編集キー/
■22782 / inTopicNo.6)  Re[4]: 画像の表示
□投稿者/ 渡り鳥 (4回)-(2008/08/01(Fri) 08:26:38)
No22777 (Hongliang さん) に返信
> 2008/07/31(Thu) 21:27:31 編集(投稿者)
>
> WinForms を使う場合、グラフィック関連の操作は一般的に System.Drawing 以下の名前空間のクラスを使用します。PictureBox の Image プロパティも、System.Drawing.Image 型になっていますよね?(MSDN でご確認ください)
> System.Windows.Forms 以下を除く System.Windows 以下の名前空間は、一般的に WPF アプリケーションのために用意されています。WinForms で System.Windows.Media.Imaging のクラス使用もやってやれないことはないですが大変面倒です。
>
> まずはこの Image プロパティの型である System.Drawing.Image をお調べください。
>
> // でも cr2 なんて拡張子からするとキャノンの独自 RAW 形式っぽいから GDI+ じゃロードできなさそうだなぁ。多分 WPF でも扱えないだろうなぁ。

返信ありがとうございます。
さっそく調べてみて対応していきたいと思います。
また進展などありましたら、ご報告させていただきます。

引用返信 編集キー/
■22783 / inTopicNo.7)  Re[4]: 画像の表示
□投稿者/ 渡り鳥 (5回)-(2008/08/01(Fri) 08:32:34)
No22781 (オショウ さん) に返信
> ■No22775 (渡り鳥 さん) に返信
>>
>>拡張子の『*.CR2』はCanon製品のカメラで撮影した画像の拡張子です。
>
>   そういうことは『最初』に書いておくことだよ!
>
>   で、結論から・・・CR2画像ファイルの展開ができないことには
>   無理。
>
>   キャノンからCR2ファイルの形式の公表が無い限り、できません。
>
> ※ どこかにCR2フォーマットのファイル情報があれば、ご自信で、
>   DIBかBMPに変換するコーディングを書いてからPictureBox
>   に読み込めること(表示)ができるようになります。
>
> ● 逃げ手として・・・
>
>   CR2ファイルを表示するビューワに表示させ、ウィンドウハンドル
>   からカットアンドペースト(クリップボード経由)で、自身のPictureBox
>   に張り込むとか・・・
>
> 以上。


返信ありがとうございます。
言葉足らずで申し訳ございません。
また、表示するための別の方法などご提供いただきありがとうございます。
いろいろ試してみて、進展などありましたらご報告させていただきます。
引用返信 編集キー/
■23099 / inTopicNo.8)  Re[5]: 画像の表示
□投稿者/ shin (3回)-(2008/08/08(Fri) 14:12:16)
            BitmapDecoder bd = BitmapDecoder.Create(new Uri(path), BitmapCreateOptions.None, BitmapCacheOption.None);
            BitmapSource bs = bd.Frames[0];
            
            JpegBitmapEncoder encoder = new JpegBitmapEncoder();
            encoder.Frames.Add(BitmapFrame.Create(bs));
            MemoryStream ms = new MemoryStream();
            encoder.Save(ms);
            ms.Seek(0, SeekOrigin.Begin);
            pictureBox1.Image = new Bitmap(ms);

思いつき+勉強不足なのでもっとましな方法があるような気もしますが、とりあえず動きます。
CanonのRAWを持っていないのでそちらでは試せていませんが、PENTAXのRAW(PEF)では表示できました。


引用返信 編集キー/
■23241 / inTopicNo.9)  Re[6]: 画像の表示
□投稿者/ 渡り鳥 (6回)-(2008/08/11(Mon) 19:49:39)
No23099 (shin さん) に返信
> BitmapDecoder bd = BitmapDecoder.Create(new Uri(path), BitmapCreateOptions.None, BitmapCacheOption.None);
> BitmapSource bs = bd.Frames[0];
>
> JpegBitmapEncoder encoder = new JpegBitmapEncoder();
> encoder.Frames.Add(BitmapFrame.Create(bs));
> MemoryStream ms = new MemoryStream();
> encoder.Save(ms);
> ms.Seek(0, SeekOrigin.Begin);
> pictureBox1.Image = new Bitmap(ms);
>
> 思いつき+勉強不足なのでもっとましな方法があるような気もしますが、とりあえず動きます。
> CanonのRAWを持っていないのでそちらでは試せていませんが、PENTAXのRAW(PEF)では表示できました。
>
>

shin さん
ありがとうございます。
返信が遅くなり大変申し訳ございません。
是非ためさせて頂きご報告させて頂きたいと思いますので、
よろしくお願いいたします。

引用返信 編集キー/
■23416 / inTopicNo.10)  Re[4]: 画像の表示
□投稿者/ shin (4回)-(2008/08/14(Thu) 09:26:41)
他の人のために解説を入れておくと、System.Windows.Media.ImagingのBitmapDecoderはフォーマットの自動認識機能を持っています。
組み込みではJPEGやPNGやTIFFを扱えますが、Codecをインストールすることで対応するフォーマットを拡張することが出来ます。
拡張できるというよりは、もともとRAWなどの独自フォーマットを(そちらのメーカーにCodecを作らせることで)読めるようにするために作られた仕組みです。

ちなみに、自動認識に失敗すると(対応するCodecがインストールされていないと)BitmapDecoder.CreateがFileFormatExceptionを吐きます。
逆に言えば、例外にならなければ少なくともフォーマットは認識されていて画像が(あるとすれば)取り出せる状態です。

なので、

No22777
> // でも cr2 なんて拡張子からするとキャノンの独自 RAW 形式っぽいから GDI+ じゃロードできなさそうだなぁ。多分 WPF でも扱えないだろうなぁ。

No22781
>   で、結論から・・・CR2画像ファイルの展開ができないことには
>   無理。
>
>   キャノンからCR2ファイルの形式の公表が無い限り、できません。

というのは誤りです。すでに読めているのですから。

問題があったのは取り出した後のデータをどう扱うべきかという点で、この時点ではすでに元のフォーマットが何だったかは無関係です。

引用返信 編集キー/
■23417 / inTopicNo.11)  Re[4]: 画像の表示
□投稿者/ シャノン (566回)-(2008/08/14(Thu) 10:13:56)
No22777 (Hongliang さん) に返信
> // でも cr2 なんて拡張子からするとキャノンの独自 RAW 形式っぽいから GDI+ じゃロードできなさそうだなぁ。多分 WPF でも扱えないだろうなぁ。

割り込んじゃって恐縮ですが、GDI+ のデコーダって自分で作れるんでしょうか?
引用返信 編集キー/
■23421 / inTopicNo.12)  Re[5]: 画像の表示
□投稿者/ 魔界の仮面弁士 (814回)-(2008/08/14(Thu) 11:27:40)
No23417 (シャノン さん) に返信
> 割り込んじゃって恐縮ですが、GDI+ のデコーダって自分で作れるんでしょうか?

おそらく、現時点では無理だと思います。将来は可能になるかも知れませんけれども。

外部コーデックを利用するためには、GdiplusStartup API の第二引数で、
.SuppressExternalCodecs = TRUE; を指定する必要があるのですが、
マネージ版の場合、これを FALSE にして呼びだしているためです。

また、そもそも GDI+ 1.0 では、独自のコーデックを利用する機能が未実装で
あるため、SuppressExternalCodecs の指定そのものが無視されることになります。
引用返信 編集キー/
■23426 / inTopicNo.13)  Re[6]: 画像の表示
□投稿者/ シャノン (569回)-(2008/08/14(Thu) 13:59:34)
No23421 (魔界の仮面弁士 さん) に返信
> ■No23417 (シャノン さん) に返信
>>割り込んじゃって恐縮ですが、GDI+ のデコーダって自分で作れるんでしょうか?
>
> おそらく、現時点では無理だと思います。
>
> 外部コーデックを利用するためには、GdiplusStartup API の第二引数で、
> .SuppressExternalCodecs = TRUE; を指定する必要があるのですが、
> マネージ版の場合、これを FALSE にして呼びだしているためです。
>
> また、そもそも GDI+ 1.0 では、独自のコーデックを利用する機能が未実装で
> あるため、SuppressExternalCodecs の指定そのものが無視されることになります。

なるほどー。
GDI+ には 1.1 があるようですが、同じでしょうね。
MSDN を見ても GdiplusStartupInput::GdiplusVersion は 1 で固定みたいですから。

> 将来は可能になるかも知れませんけれども。

GDI+ に未来はあるのか…
引用返信 編集キー/
■23430 / inTopicNo.14)  Re[7]: 画像の表示
□投稿者/ 渋木宏明(ひどり) (848回)-(2008/08/14(Thu) 14:31:35)
渋木宏明(ひどり) さんの Web サイト
> GDI+ に未来はあるのか…

現状のやつはこのまま固定カモ。

Vista では旧 GDI も CPU で描画するようになってしまったので、.NET も GDI+ に頼らないで自前になっちゃう未来もあったりして。

引用返信 編集キー/
■23431 / inTopicNo.15)  Re[8]: 画像の表示
□投稿者/ シャノン (570回)-(2008/08/14(Thu) 14:54:35)
No23430 (渋木宏明(ひどり) さん) に返信
> .NET も GDI+ に頼らないで自前になっちゃう未来もあったりして。

既に部分的には頼ってなかったりして。
TextRenderer とか SetCompatibleTextRenderingDefault とか。
引用返信 編集キー/
■23436 / inTopicNo.16)  Re[7]: 画像の表示
□投稿者/ 魔界の仮面弁士 (816回)-(2008/08/14(Thu) 15:50:08)
No23426 (シャノン さん) に返信
> GDI+ には 1.1 があるようですが、同じでしょうね。
> MSDN を見ても GdiplusStartupInput::GdiplusVersion は 1 で固定みたいですから。
GdiplusStartupInput.GdiplusVersion は、1 固定ですが、
GdiplusStartupInputEx.GdiplusVersion は、2 です(要 GDI+ v1.1)。

ただし現時点で、マネージ版が利用しているのは前者となります。
引用返信 編集キー/
■23437 / inTopicNo.17)  Re[8]: 画像の表示
□投稿者/ シャノン (572回)-(2008/08/14(Thu) 16:10:36)
No23436 (魔界の仮面弁士 さん) に返信
> GdiplusStartupInput.GdiplusVersion は、1 固定ですが、
> GdiplusStartupInputEx.GdiplusVersion は、2 です(要 GDI+ v1.1)。

そんな構造体…MSDNにも載ってないよ…

> ただし現時点で、マネージ版が利用しているのは前者となります。
引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -