2012-06-01 2 views
8

WinForm에서 CF를 사용하여 SQLite로 이미지를 저장하고로드하려고합니다. db로 이미지를 저장하는 방법을 찾았지만 DB에 저장된 이미지를로드 할 수있는 방법을 찾지 못해서 올바른지 모릅니다.이미지 저장 및로드 SQLite C#

void SaveImage(string pic){ 
     string query = "insert into Table (Photo) values (@pic);"; 
     string conString = @" Data Source = \Program Files\Users.s3db ";    
     SQLiteConnection con = new SQLiteConnection(conString); 
     SQLiteCommand cmd = new SQLiteCommand(query, con); 
     cmd.Parameters.Add("@pic",DbType.String); 
     con.Open(); 
     try{ 
      cmd.ExecuteNonQuery(); 
     } 
     catch (Exception exc1){ 
      MessageBox.Show(exc1.Message); 
     } 
     con.Close(); 
    } 

내가 반대를 만들 수있는 코드를 가지고 :이 DB에 이미지를 저장하려면 코드가

public void ImageToBase64(Image image, System.Drawing.Imaging.ImageFormat format){ 
     using (MemoryStream ms = new MemoryStream()){ 
      // Convert Image to byte[] 
      image.Save(ms, format); 
      byte[] imageBytes = ms.ToArray(); 

      // Convert byte[] to Base64 String 
      string base64String = Convert.ToBase64String(imageBytes); 
      SaveImage(base64String); 
     } 
    } 

입니다 :

나는 Base64로로 내 이미지를 변환하는 코드가 ImageToBase64하지만 먼저 db에서 이미지를로드해야합니다. 그걸 할 생각이야?

EDIT 찰리가 제안한대로 이미지를 저장하기 위해 얼룩을 사용하려고합니다.

Image photo = new Bitmap(@"\Photos\Image20120601_1.jpeg"); 
SaveImage(photo); 

void SaveImage(Image pic){ 
string conString = @" Data Source = \Program Files\Users.s3db ";    
SQLiteConnection con = new SQLiteConnection(conString); 
SQLiteCommand cmd = con.CreateCommand(); 
cmd.CommandText = String.Format("INSERT INTO Table (Photo) VALUES (@0);"); 
SQLiteParameter param = new SQLiteParameter("@0", System.Data.DbType.Binary); 
param.Value = pic; 
cmd.Parameters.Add(param); 
con.Open(); 
try{ 
    cmd.ExecuteNonQuery(); 
} 
catch (Exception exc1){ 
    MessageBox.Show(exc1.Message); 
} 
con.Close();} 

그러나 때 나는 ExcecuteNonQuery()InvalidCastException이의 오류를 잡아 : 나는이 코드를 시도했다.

아무 것도 제안하지 않습니까?

해결이 코드는 데이터베이스에 이미지를 저장 한 다음이의 PictureBox에 표시되도록 이미지를로드 : 당신의 도움에 대한

namespace ImagenSQLite 
{ 
    public partial class Form1 : Form 
    { 
     public Form1() 
     { 
      InitializeComponent(); 
      Image photo = new Bitmap(@"\Photos\Image20120601_1.jpeg"); 
      byte[] pic = ImageToByte(photo, System.Drawing.Imaging.ImageFormat.Jpeg); 
      SaveImage(pic); 
      LoadImage(); 
     } 

     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 Base64ToImage(string base64String) 
     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; 
     } 
     /***************** SQLite **************************/ 
     void SaveImage(byte[] imagen){ 
      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 Empleados (Foto) VALUES (@0);"); 
      SQLiteParameter param = new SQLiteParameter("@0", System.Data.DbType.Binary); 
      param.Value = imagen; 
      cmd.Parameters.Add(param); 
      con.Open(); 

      try 
      { 
       cmd.ExecuteNonQuery(); 
      } 
      catch (Exception exc1) 
      { 
       MessageBox.Show(exc1.Message); 
      } 
      con.Close(); 
     } 
     void LoadImage(){ 
      string query = "SELECT Photo FROM Table WHERE ID='5';"; 
      string conString = @" Data Source = \Program Files\Users.s3db "; 
      SQLiteConnection con = new SQLiteConnection(conString); 
      SQLiteCommand cmd = new SQLiteCommand(query, con);    
      con.Open(); 
      try 
      { 
       IDataReader rdr = cmd.ExecuteReader(); 
       try 
       { 
        while (rdr.Read()) 
        { 
         byte[] a = (System.Byte[])rdr[0]; 
         pictureBox1.Image = ByteToImage(a); 
        } 
       } 
       catch (Exception exc) { MessageBox.Show(exc.Message); } 
      } 
      catch (Exception ex) { MessageBox.Show(ex.Message); } 
      con.Close(); 
     }  
    } 
} 

감사합니다!

답변

4

데이터베이스에서 이미지를로드하려면 다른 종류의 데이터와 마찬가지로 SQL select 문을 사용하여 데이터를 다시 가져옵니다. base64로 인코딩 된 이미지는 SQLite 데이터베이스에 문자열로 저장됩니다. 따라서 데이터베이스에 다른 문자열 (예 : 사용자 이름)을 저장하는 것처럼 문자열로 검색합니다.

string LoadImage() { 
    string query = "select Photo from Table;"; 
    string conString = @" Data Source = \Program Files\Users.s3db ";    
    SQLiteConnection con = new SQLiteConnection(conString); 
    SQLiteCommand cmd = new SQLiteCommand(query, con); 
    string base64EncodedImage = null; 
    con.Open(); 
    try { 
     IDataReader reader = cmd.ExecuteReader(); 
     reader.Read(); // advance the data reader to the first row 
     base64EncodedImage = (string) reader["Photo"]; 
     reader.Close(); 
    } 
    catch (Exception ex) { 
     MessageBox.Show(ex.Message); 
    } 
    con.Close(); 
    return base64EncodedImage; 
} 

저장 코드와 마찬가지로 이미지를로드하는 예제 코드는 테이블에 저장된 이미지 하나만 사용합니다. 두 개 이상의 이미지를로드하고 저장하려면 ID 필드를 테이블에 삽입 한 다음 SQL select 문에 where 절을 사용해야합니다.


저는 개인적으로 이미지를 base64 인코딩 문자열로 저장할 것이라고 확신하지 않습니다. 이미지의 문자열 표현은 이진 표현보다 훨씬 큽니다. SQLite supports the BLOB data type, 그래서 그것을 사용하는 것입니다.

+0

찰리, 답변 해 주셔서 감사합니다. 나는 당신의 코드를 시도했지만 당신이 문자열로 독자를 캐스팅 한 라인에서 CastInvalidException의 에러를 잡았다. 이것은 내 줄'base64EncodedImage = (string) reader [ "Photo"];'입니다. 어쩌면 이미지를 성공적으로 저장하지 못하고있을 수도 있습니다. –

+0

아마도 문제는 사진 필드가 얼룩인지, 그럴 수 있습니까? –

+0

사진을 base64로 저장하지 않으면 이미지를 데이터베이스로 직접 전달해야합니까? 나는 'SaveImage (Image Pic)'와 'cmd.Parameters.Add ("@pic", DbType.Binary)를 넣어야한다;'? –

관련 문제