🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

SQL Server

SQL Serverはマイクロソフトのリレーショナルデータベース管理システムです。データマイニングや多次元解析など、ビジネスインテリジェンスのための機能が備わっています。

.NET Framework

.NET Framework は、Microsoft Windowsのオペレーティングシステムのために開発されたソフトウェア開発環境/実行環境です。多くのプログラミング言語をサポートしています。

ADO.NET

ADO.NETは.NET Frameworkで各種データベースへの統一された接続機能を提供するソフトウェアコンポーネントの集合です。

Q&A

1回答

4888閲覧

画像を外部アプリケーションで開く方法

kswdfr

総合スコア21

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

SQL Server

SQL Serverはマイクロソフトのリレーショナルデータベース管理システムです。データマイニングや多次元解析など、ビジネスインテリジェンスのための機能が備わっています。

.NET Framework

.NET Framework は、Microsoft Windowsのオペレーティングシステムのために開発されたソフトウェア開発環境/実行環境です。多くのプログラミング言語をサポートしています。

ADO.NET

ADO.NETは.NET Frameworkで各種データベースへの統一された接続機能を提供するソフトウェアコンポーネントの集合です。

0グッド

0クリップ

投稿2019/12/07 13:04

編集2019/12/07 21:21

質問

Visual Studio2017でWindowsFormをADO.NETを使ったデータベース(SqlServer)プログラミングででデータベースに保存した画像をVARBINARYで保存しています。
保存した画像をlistViewに表示しています。
listViewにある画像を選択して選択した画像を取得して外部アプリケーションを起動させたいです。
https://dobon.net/vb/dotnet/process/shell.htmlを参考に

private void button5_Click_1(object sender, EventArgs e) { System.Diagnostics.Process p = System.Diagnostics.Process.Start(listView1.SelectedItems); }

としました。すると

エラー CS1503 引数 1: は 'System.Windows.Forms.ListView.SelectedListViewItemCollection' から 'string' へ変換することはできません。

というエラー文が表示されて外部アプリケーションを開くことができません。
なので画像を外部アプリケーションで開く方法を教えてください。

private void button2_Click(object sender, EventArgs e) //ボタンを押すと画像と画像の名前を表示する { // ListViewの下準備 int width = 100; int height = 80; imageList1.ImageSize = new Size(width, height); listView1.LargeImageList = imageList1; imageList1.Images.Clear(); listView1.Items.Clear(); // 検索 var query = "SELECT Photoname,Photo FROM [dbo].[IMAGE] " + "WHERE GenreID IN (SELECT GenreID FROM [dbo].[GENRE] " + "WHERE Genre Like '%' + @Genre + '%')"; var command = new SqlCommand(query, conn); command.Parameters.Add(new SqlParameter("@Genre", comboBox3.Text)); var dt = new DataTable(); var adapter = new SqlDataAdapter(command); adapter.Fill(dt); // PhotoをImageオブジェクトにしてサムネイル用にサイズ調整し、 // Titkeと一緒にListViewへ追加 foreach (var row in dt.AsEnumerable()) { var Photoname = row["Photoname"].ToString(); var ms = new MemoryStream((byte[])row["Photo"]); var original = Image.FromStream(ms); var thumbnail = createThumbnail(original, width, height); imageList1.Images.Add(thumbnail); listView1.Items.Add(Photoname, dt.Rows.IndexOf(row)); original.Dispose(); thumbnail.Dispose(); } Image createThumbnail(Image image, int w, int h) { Bitmap canvas = new Bitmap(w, h); Graphics g = Graphics.FromImage(canvas); g.FillRectangle(new SolidBrush(Color.White), 0, 0, w, h); float fw = (float)w / (float)image.Width; float fh = (float)h / (float)image.Height; float scale = Math.Min(fw, fh); fw = image.Width * scale; fh = image.Height * scale; g.DrawImage(image, (w - fw) / 2, (h - fh) / 2, fw, fh); g.Dispose(); return canvas; } }

###制作物
Windows Form
###参考文献
https://dobon.net/vb/dotnet/process/shell.html

開発環境

Visual Sutaudio2017,C#,.NET Framework4.7,SQL Server Express2017,Windows10

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

外部アプリの起動は一旦ファイルに書き出して処理する形になるかと思います。

また、外部アプリへ渡すのはオリジナルの画像データですよね?
オリジナルの画像データはサムネイル作成後に捨てているみたいですから、その辺りをどうするのか考えないとダメでしょう。

投稿2019/12/08 01:22

YAmaGNZ

総合スコア10469

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

kswdfr

2019/12/08 05:30

外部アプリで渡すのはエクスプローラーに保存してある画像をデータベースにVARBINARYで保存したのを渡したいです。
YAmaGNZ

2019/12/08 05:38 編集

その外部アプリにメモリ上で渡せるインターフェイスがあるのですか? ないのであれば一旦ファイルに書き出すしかないかと思います。
kswdfr

2019/12/08 06:32

インターフェイスがあるかどうかわからないですがprivate void button5_Click_1(object sender, EventArgs e) { System.Diagnostics.Process p = System.Diagnostics.Process.Start(textBox.text); }でtextBoxにパスを書いてボタンを押したらどのアプリで開きますか?と出るのでlistViewに表示している画像を選択して外部アプリを開けると僕は思ったので質問しました。
YAmaGNZ

2019/12/08 06:37

それはファイルを指定して開いていますよね? ですから、それと同じようにファイルに保存してから開くようにしてくださいということです。
kswdfr

2019/12/08 07:40

保存している画像を名前で検索して取得して外部アプリで開く事は出来ますか?
YAmaGNZ

2019/12/08 08:14

名前とはなんですか?検索とはどこから何を検索して、何を取得するのですか?
kswdfr

2019/12/08 09:58

データベースに保存してある画像の名前でVARBINARYで保存してある画像を取得したいです。 "SELECT Photoname from [dbo].[IMAGE]" "WHERE Photo Like `%" + listView.text +"%`";
YAmaGNZ

2019/12/08 10:27

それが出来るかはデータ構造やデータ次第なので私には分かりません。 それに、名前で検索するなら SELECT * FROM [dbo].[IMAGE] WHERE Photoname = 'なんとか' なんじゃないですか? というか、ピンポイントの検索に何故Likeを使うんでしょうか?
kswdfr

2019/12/08 11:09

Like検索じゃないとlistView.textは使えないと思ったからです。 後serectで取得した画像を外部アプリで開く事は可能ですか?
YAmaGNZ

2019/12/08 11:13

だから、ファイルに書き出して渡しましょうと回答しています。
YAmaGNZ

2019/12/08 12:15

"WHERE Photo = `" + listView.text +"`"; でダメなんですか?という話です。 SQL文と「listView.textは使えない」は全く関係ありません。
kswdfr

2019/12/08 13:50

"WHERE Photo = `" + listView.text +"`"; でも大丈夫です。 ファイルに書き出して渡すとはエクスプローラーに画像を保存してからアプリ単体で開くということですか?
YAmaGNZ

2019/12/08 15:50

外部のアプリケーションが何なのか知りませんが、起動する際にファイル名を渡すなどでそのイメージを開くという形だと思います。 ですので、DBから読み込んだものを一旦ファイルに保存して、そのファイルを開くという形にしましょうというのが私の回答となります。 エクスプローラーはファイルやフォルダ等を表示するアプリケーションのことで、ファイル等を記録する場所ではありません。
YAmaGNZ

2019/12/08 15:52

Likeを使うということはあいまい検索を行うということです。 例えば、’ABC’というものだけをひっかけたいのに’ABCD’もひっかかることになりますので使い分けはしっかりしましょう。
kswdfr

2019/12/08 21:30

DBから読み込んだものをエクスプローラーを使ってファイルに保存する方法がわからないので教えてください。
YAmaGNZ

2019/12/08 22:10

エクスプローラーではなく「あなたが作成するプログラム」で保存するんです。 DBからImageとして取り出すことはできているのですから、それをファイルに保存するだけです。 https://www.google.com/search?&q=c%23+Image+%E4%BF%9D%E5%AD%98 こちらを参考にまずは自分で調べてください。
kswdfr

2019/12/08 23:07

調べましたが拡張子を選択して保存する方法と保存場所を指定して保存する方法とデータベースから取得した画像を.saveに渡す方法がいまいち分かりません。 画像を保存する保存形式はjpgかpngかユーザーが好きな拡張子をつけるようにするかを選択できるようにしたいです。 拡張子の選択とセーブする場所の選択はエクスプローラーを開いて保存するようにしたいです。
YAmaGNZ

2019/12/09 00:40

前のコメントでのURL(検索結果)の最初に出てきたページ https://dobon.net/vb/dotnet/graphics/saveimage.html こちらを見ても分かりませんか? また、目的は「外部アプリで開く」ではないのですか? それに保存先を指定する必要があるのかは分かりませんが、保存先を指定するのであれば SaveFileDialog クラス(https://docs.microsoft.com/ja-jp/dotnet/api/microsoft.win32.savefiledialog?view=netframework-4.8) を使用してください。
kswdfr

2019/12/09 00:53

データベースから取得した画像を.saveに渡す方法がいまいち分かりません。 画像を保存してから外部アプリで開くと言っていたので画像を保存する方法がわからないので聞きました。
YAmaGNZ

2019/12/09 01:01

あなたの言う「.save」とは何のことですか? ImageクラスのSaveメソッドのことでしたら、あなたのプログラムでデータベースからImageを取得できていますよね? そのImageのSaveメソッドを呼べばいいだけです。 それで、その保存したファイルを開けば関連付けられたアプリケーションで開けます。 手順としては 1.データベースからImageを読み込む(ここはできているはず) 2.読み込んだImageを保存する(Saveメソッドを呼ぶ) 3.保存したファイルを開く(関連付けられたアプリケーションで開く) の手順になるかと思います。 3のところで開いて欲しい外部アプリケーションが関連付けられたものと違うのであれば、そのアプリケーションの開き方に則った開き方をしてください。
kswdfr

2019/12/09 08:26

2.読み込んだImageを保存する(Saveメソッドを呼ぶ)のところで private void button5_Click(object sender, EventArgs e) { //項目が1つも選択されていない場合 if (listView1.SelectedItems.Count == 0) { //処理を抜ける return; } ListViewItem itemx = listView1.SelectedItems[0]; //1番目に選択されれいるアイテムをitemxに格納 itemx = listView1.SelectedItems[0]; cn.ConnectionString = cnstr; cn.Open(); cmd.Connection = cn; cmd.CommandType = CommandType.Text; cmd.CommandText = "SELECT Photo FROM [dbo].[IMAGE]" + "WHERE Photoname = `" + itemx.Text + "`"; rd = cmd.ExecuteReader(); rd.Save("C:\Image.png", System.Drawing.Imaging.ImageFormat.Png); rd.Close(); cn.Close(); } としたら エラー CS1061 'SqlDataReader' に 'Save' の定義が含まれておらず、型 'SqlDataReader' の最初の引数を受け付けるアクセス可能な拡張メソッド 'Save' が見つかりませんでした。using ディレクティブまたはアセンブリ参照が不足していないかを確認してください と表示されて実行できませんでした。 どこが間違っているかわからないので教えてください。
YAmaGNZ

2019/12/09 08:38 編集

1の「データベースからImageを読み込む」が出来ていません。 サムネイルを作成する部分でデータベースから読み込んでImageにするということを行っていますので、そこを参考にしてください。 また、呼び出すべきSaveメソッドはImageクラスのものです。 自分がどのクラスのどのメソッドを呼び出すのか把握しましょう。
kswdfr

2019/12/09 08:42

1の「データベースからImageを読み込む」が出来ていません。 サムネイルを作成する部分でデータベースから読み込んでImageにするということを行っていますので、そこを参考にしてください。 とどこが間違っているかいまいちわからないのでわかりやすく教えてください。
YAmaGNZ

2019/12/09 08:45

ご自身でどのようなプログラムを作成しているのか理解していないのですね。 現状のサムネイルを作成する部分で「データベースから読み込んでImageにする」ということをどこで行っているか分かりますか?
kswdfr

2019/12/09 08:50

cmd.CommandText = "SELECT Photo FROM [dbo].[IMAGE]" + "WHERE Photoname = `" + itemx.Text + "`"; rd = cmd.ExecuteReader();でデータベースから読み込んでImageにしていると思います。
YAmaGNZ

2019/12/09 08:55

私のコメントをしっかり読んでください。 「現状のサムネイルを作成する部分で」と書いています。 あなたが今挙げた場所はサムネイルを作成する場所ですか? cmd.ExecuteReaderで返ってくるのはSqlDataReaderでImageではありません。
kswdfr

2019/12/09 10:19 編集

「データベースから読み込んでImageにする」ということをどこで行っているか分からないので教えてほしいです。 あなたが今挙げた場でー所はデータベースに保存してある画像をSELECT文で取り出す部分だと思います。
kswdfr

2019/12/09 10:20

1データベースからImageを読み込むところのSQL文以外がわからないので教えてほしいです。
YAmaGNZ

2019/12/09 11:03

createThumbnailが何をしているかも理解してないのですね。 はっきり言っていくら説明しても質問に挙げた自分のソースすら理解していないのではお話になりません。 人のコメントも理解していないようですので、私は手を引かせてもらいます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.36%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問