4

これは不可能かもしれませんが、あまり人気がないかもしれませんが、実際に画像を圧縮する画像用のデータファイルをどのように作成するのか疑問に思いました。合計200MBの画像ファイルがあるとしましょう。それらを1つのファイルに保存するために使用できるシステムはありますか?それはそれらを合計150MBのようなサイズに圧縮しますか?(単なる例の数字、比率は重要ではありません)。

Base64画像をでエンコードしてデータベースに保存できることは知っていSQLiteますが、画像をエンコードされた形式で保存すると、実際には元の画像ファイル自体よりもわずかに大きいサイズになることを読みました。

私もZIPファイルを考えていましたが、それ自体が「ライブラリ」として使用できるかどうかわかりませんでしたか?

このようなものが事前定義されたクラスとして存在しない場合、誰かが私を正しい方向に導くことができますか?

これは私が探しているもののモックです:

class ImageLibrary {
  //this is where the code would go for the library?
}

class MyProgram{
  public MyProgram() 
  {
    ImageLibrary library = new ImageLibrary();
    library.Add(<Image object here, with an ID of sorts>);
    library.Add(<Another image object here, also with an ID>);
    Load += new FormLoadEventHandler(MyProgram_Load);
  }

  void MyProgram_Load(object sender, EventArgs e)
  {
    PictureBox.Image = library.Get(<image id here>);
  }
}

これが可能であることを願っています。それ以外の場合は、少し大きいファイルサイズに我慢して、Base64それらをエンコードします。ただし、現時点では、保存したい画像が500近くあるため、保存されたkBは獲得されたkBになります。:)また、私のコード例の品質を判断しないでください。これは単なるモックアップであり、カフから書き留めました。

よろしくお願いします。

4

2 に答える 2

3

画像をバイナリファイルとして保存することが役立つ場合、これは私が画像をバイナリに変換してからSQLiteに保存するために使用するコードです。

public byte[] ImageToByte(Image image, System.Drawing.Imaging.ImageFormat format){
        using (MemoryStream ms = new MemoryStream())
        {
            // Convert Image to byte[]
            image.Save(ms, format);
            byte[] imageBytes = ms.ToArray();
            return imageBytes;
        }
    }
    public Image ByteToImage(byte[] imageBytes)
    {
        // Convert byte[] to Image
        MemoryStream ms = new MemoryStream(imageBytes, 0, imageBytes.Length);
        ms.Write(imageBytes, 0, imageBytes.Length);
        Image image = new Bitmap(ms); 
        return image;
    }

そして、バイナリを保存するには:

void SaveImage(byte[] image){
        string conStringDatosUsuarios = @" Data Source = \Program Files\GPS___CAM\Data\DatosUsuarios.s3db ";            
        SQLiteConnection con = new SQLiteConnection(conStringDatosUsuarios); 
        SQLiteCommand cmd = con.CreateCommand();
        cmd.CommandText = String.Format("INSERT INTO Users (Foto) VALUES (@0);");
        SQLiteParameter p = new SQLiteParameter("@0", System.Data.DbType.Binary);
        p.Value = image;
        cmd.Parameters.Add(p);            
        con.Open(); 
        try
        {
            cmd.ExecuteNonQuery();
        }
        catch (Exception exc1)
        {
            MessageBox.Show(exc1.Message);
        }
        con.Close();
    }

それが役に立てば幸い

編集あなたが尋ねたように、私はロードイメージコードで更新しています:(バイトをイメージに変換するには、ByteToImage関数を使用する必要があります)

void LoadImage(string tag){
        string query = "SELECT Foto FROM Users;";
        string conString = @" conection to your database ";
        SQLiteConnection con = new SQLiteConnection(conString); 
        SQLiteCommand cmd = new SQLiteCommand(query, con);            
        con.Open();
        try
        {
            SQLiteDataReader rdr = cmd.ExecuteReader();
            try
            {
                while (rdr.Read())
                {
                    pictureBox1.Image = ByteToImage((System.Byte[])rdr[0]);
                }
            }
            catch (Exception exc) { MessageBox.Show(exc.Message); }
        }
        catch (Exception ex) { MessageBox.Show(ex.Message); }
        con.Close();
    }

編集2これを試して、ロードしようとしているデータのタイプを確認してください。

System.Type checkType = rdr[0].GetType();
pictureBox1.Image = ByteToImage((System.Byte[])rdr[0]);

コードの最初の行を追加し、その行にブレークポイントを設定します。checkTypeのタイプを確認してください。おそらくそれはバイナリではありません。結果を教えてください。

于 2012-06-11T12:00:06.337 に答える
1

この記事をチェックしてください:http://msdn.microsoft.com/en-us/library/aa479502.aspx

お役に立てば幸いです。ZIPからファイルにアクセスするためのアイデア。これはすぐに使用できるソリューションではありませんが、優れた概念の説明です。

于 2012-06-11T11:53:10.100 に答える