2

DB4o を使用して写真を保存し、次のコードを試してみました。

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.IO;
using Db4objects.Db4o;
using Db4objects.Db4o.Linq;

namespace imagemsDb4o
{

class Person
public class Person
{
    public string Name { set; get; }
    public byte foto { set; get; }
}

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

           private void Form1_Load(object sender, EventArgs e)
        {

        }

        private void button1_Click_1(object sender, EventArgs e)
        {
            FileInfo fi = new FileInfo("c:\\test.yap");
            if (fi.Exists)
                fi.Delete();
            pictureBox1.Load("c:\\sunset.jpg");

            Person pers = new Person();
            pers.Name = "Martin";
            pers.bild = (System.Drawing.Bitmap)(pictureBox1.Image);

            IObjectContainer db = Db4oFactory.OpenFile("c:\\test.yap");
            db.Store(pers);
            db.Commit();
            db.Close();
        }

        private void button2_Click_1(object sender, EventArgs e)
        {
            Person suchpers = new Person();
            suchpers.Name = "Martin";

            IObjectContainer db = Db4oFactory.OpenFile("c:\\test.yap");
            IObjectSet result = db.QueryByExample(suchpers);
            Person gefunden = (Person)result.Next();

            textBox2.Text = (string) gefunden.Name;

            pictureBox2.Image = (byte) gefunden.bild;
            db.Close();
        }

    }
}

ボタン2をクリックするとエラーが発生します。どのような変更を加える必要がありますか?

4

2 に答える 2

3

WindowForms/WPF (System.Drawing.Bitmap-Object) から GUI/Drawing-Object を保存しようとしています。ただし、これは機能しません。その理由は、GUI クラス (Winforms、WPF など) には、OS リソースへのネイティブ ハンドルのように、基礎となる描画システムへの参照が含まれていることが多いためです。そして、それらは正しくシリアライズできません。そのような場合、イメージを表すクラスを作成します。このクラスには、画像の表現が含まれています。通常、これは画像を格納する Blob です。

Blob を処理するには、2 つの基本的な方法があります。blob をバイト配列としてデータベースに格納するか、特別な db4o-Blob-Type を使用します。どちらにも利点があります。

バイト配列の長所と短所:

  • ブロブは db4o-database-file にあります。したがって、コピーするファイルは 1 つだけです。
  • バイト配列は通常の db4o トランザクションの一部であり、期待どおりに動作します。
  • 大きな BLOB を格納する場合、db4o のデータベース サイズの制限に遭遇する可能性があります。(256GB)

db4o-blob の長所と短所

  • BLOB は、データベースの外部にある通常のファイルとして保存されます。これにより、データベース自体が小さく保たれます。さらに、通常のアプリケーションを使用して、保存されているすべての BLOB にアクセスできます。
  • blob-directory とデータベースは常にコピーする必要があります。
  • db4o-blob は、db4o トランザクションの外部で機能します。これは、db4o-blob が他の格納されたオブジェクトとは異なる動作をすることを意味します (そして API は少し奇妙です)。ただし、これにより、現在のトランザクションをブロックせずに db4o-blob を取得できます。

あなたの場合、Person クラスに画像を含む byte[] 配列を格納します。または、特別な Image-class を作成します。この画像クラスには、画像を含むバイト配列が含まれています。そして、このバイト配列を Winforms ビットマップとの間で変換するいくつかのメソッド。

于 2010-06-27T11:02:26.597 に答える
1

写真プロパティに割り当てる前に画像をバイト配列に変換し、画像ボックスの画像プロパティに割り当てる前にバイト配列をビットマップに戻す必要があると思います

于 2010-06-26T15:01:06.200 に答える