質問をすることでしか得られない、回答やアドバイスがある。

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

ただいまの
回答率

88.91%

Visual Studio データベースへの画像の格納、及び表示(PictureBoxを使用)

受付中

回答 1

投稿

  • 評価
  • クリップ 0
  • VIEW 2,746

niko2

score 15

前提・実現したいこと

Visual Studio 2015 にてC#を使いWindows Formsのアプリケーションを開発しています。
データベースはPostgreSQL(9.5)
Npgsql(3.1.9)を使用し、データベースにアクセスしています。

今回実現したいことは、Form1(↓画像1番目)の画像選択ボタンを押すと、Form2(↓画像2番目)に移動し、Form2にて画像をダブルクリックすると、Form1のpicturebox1に画像が入り(←ここまで自分で解決済み)、さらにデータベースに画像を格納することです。また、データベースに格納した画像は、別のフォームで使用しPictureBoxなどで表示します。

しかし、PictureBoxに表示された画像をデータベースに格納する方法、またデータベースに格納された画像を表示する方法がわかりません。
お教えいただけないでしょうか

Form1
イメージ説明
Form2
イメージ説明

該当のソースコード

Form1()

using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.IO;
using System.Diagnostics;

namespace WindowsFormsApplication1
{
    public partial class TRDetailsEdit : Form
    {
        public PictureBox pb { get; internal set; }

        public TRDetailsEdit()
        {
            InitializeComponent();
        }

        private void TRDetailsEdit_Load(object sender, EventArgs e)
        {
            if (pb != null)
                pictureBox1.Image = pb.Image;
        }

        private void button4_Click(object sender, EventArgs e)
        {
            WindowsFormsApplication1.ImageExplorer ie = new ImageExplorer();
            ie.Show();
            Close();
        }
    }
}


Form2

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.IO;
using System.Diagnostics;

namespace WindowsFormsApplication1
{
    public partial class ImageExplorer : Form
    {###ヘディングのテキスト
        public ImageExplorer()
        {
            InitializeComponent();
        }

        private void ImageExplorer_Load(object sender, EventArgs e)
        {
            comboBox1.SelectedIndex = 0;
        }

        private void pictureBox_DoubleClick(object sender, EventArgs e)
        {
            PictureBox pb = (PictureBox)sender;
            WindowsFormsApplication1.TRDetailsEdit trde = new TRDetailsEdit();
            trde.pb = pb;
            trde.Show();
            Close();
        }
        private void CreateThumbnails(string path)
        {
            string[] filePaths;
            int count = 0;

            foreach (PictureBox pb in flowLayoutPanel1.Controls)
            {
                Image img = pb.Image;
                pb.Image = null;
                img.Dispose();
            }

            flowLayoutPanel1.Controls.Clear();

            filePaths = Directory.GetFiles(path);     //指定されたフォルダー内のファイルのパスのコレクションを取得
            foreach (string filePath in filePaths)    //ファイルのパスのコレクションから1つずつパスを取得
            {
                try
                {
                    //指定されたパスのファイルからサムネイル用のイメージを作成
                    Image img1 = Bitmap.FromFile(filePath);
                    Image img2 = img1.GetThumbnailImage(350, 245, null, IntPtr.Zero);
                    img1.Dispose();

                    PictureBox pb = new PictureBox();
                    pb.Margin = new Padding(10);
                    pb.Image = img2;
                    pb.SizeMode = PictureBoxSizeMode.AutoSize;
                    pb.Tag = filePath;
                    pb.DoubleClick += new EventHandler(pictureBox_DoubleClick);
                    flowLayoutPanel1.Controls.Add(pb);

                    toolTip1.SetToolTip(pb, Path.GetFileName(filePath));
                    count++;
                }
                catch
                {
                    //続行してコレクションの次の要素を処理
                }
            }

            if (count == 0)
                MessageBox.Show("イメージファイルが見つかりませんでした。", button1.Text, MessageBoxButtons.OK, MessageBoxIcon.Information);
        }

        private void button1_Click(object sender, EventArgs e)
        {
            if (folderBrowserDialog1.ShowDialog() == DialogResult.OK)
            {
                textBox1.Text = folderBrowserDialog1.SelectedPath;
                CreateThumbnails(folderBrowserDialog1.SelectedPath);
            }
        }

        private void comboBox1_SelectedIndexChanged(object sender, EventArgs e)
        {
            flowLayoutPanel1.FlowDirection =
                (FlowDirection)comboBox1.SelectedIndex;
        }
    }
}

参考程度にNpgsqlを使用したデータベースアクセス(今回のFormとはつながりはありません。)

private void connectDatebase()
        {
            StringBuilder sb = new StringBuilder();
            sb.Append("Server=localhost;");
            sb.Append("Port=5433;");
            sb.Append("User Id=postgres;");
            sb.Append("Password=***;"); //インストール時入れた値
            sb.Append("Database=db_football;");

            string connString = sb.ToString();

            using (var con = new NpgsqlConnection(connString))
            {
                try
                {
                    con.Open();

                    //データ検索
                    var cmd = new NpgsqlCommand(@"select schedule1,schedule2,schedule3,schedule4,schedule5,schedule6,schedule7,schedule8,schedule9,schedule10 from tb_calendar where year = :year and month = :month and day = :day;", con);
                    cmd.Parameters.Add(new NpgsqlParameter("year", DbType.Int32) { Value = year });
                    cmd.Parameters.Add(new NpgsqlParameter("month", DbType.Int32) { Value = month });
                    cmd.Parameters.Add(new NpgsqlParameter("day", DbType.Int32) { Value = day });
                    var dataReader = cmd.ExecuteReader();  //クエリを取得

                    label2.Text = dataReader.HasRows.ToString();

                    if (dataReader.HasRows)
                    {
                        while (dataReader.Read()) //レコードを進める
                        {
                            //Console.WriteLine("{0}", dataReader["schedule1"]);
                            //int y = int.Parse(dataReader["year"].ToString());

                            label4.Text = dataReader["schedule1"].ToString();
                            label5.Text = dataReader["schedule2"].ToString();
                            label6.Text = dataReader["schedule3"].ToString();
                            label7.Text = dataReader["schedule4"].ToString();
                            label3.Text = dataReader["schedule5"].ToString();
                            label9.Text = dataReader["schedule6"].ToString();
                            label10.Text = dataReader["schedule7"].ToString();
                            label11.Text = dataReader["schedule8"].ToString();
                            label12.Text = dataReader["schedule9"].ToString();
                            label13.Text = dataReader["schedule10"].ToString();
                        }
                        //Console.Read();
                        dataReader.Close();
                    }
                    else
                    {
                        var cmd2 = new NpgsqlCommand(@"insert into tb_calendar values (null,'2016-9-12',null,null,null,null,null,null,null,null,null,null,:year,:month,:day)", con);
                        cmd2.Parameters.Add(new NpgsqlParameter("year", DbType.Int32) { Value = year });
                        cmd2.Parameters.Add(new NpgsqlParameter("month", DbType.Int32) { Value = month });
                        cmd2.Parameters.Add(new NpgsqlParameter("day", DbType.Int32) { Value = day });
                        dataReader.Close();
                        var dataReader2 = cmd2.ExecuteReader();
                    }
                }
                catch (Exception e)
                {
                    MessageBox.Show(e.ToString());
                }
            }
        }
  • 気になる質問をクリップする

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 1

0

こんにちは。

以下のNpgsqlのマニュアルにラージオブジェクト→バイト配列→画像の取り扱い例がありますのでまずは参考にしてみては如何でしょう。
https://www.postgresql.jp/document/NPGSQL/manual/UserManual_J.htm

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2016/12/04 18:22

    回答ありがとうございます。

    https://www.postgresql.jp/document/NPGSQL/manual/UserManual_J.htm
    は私には難しい内容でしたので、画像をデータベースに格納するのではなく、
    画像のファイルパスをデータベースの保存するという方法を試してみようと思います。
    情報ありがとうございます。

    キャンセル

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

  • ただいまの回答率 88.91%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る