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();
}
}
}
감사합니다!
찰리, 답변 해 주셔서 감사합니다. 나는 당신의 코드를 시도했지만 당신이 문자열로 독자를 캐스팅 한 라인에서 CastInvalidException의 에러를 잡았다. 이것은 내 줄'base64EncodedImage = (string) reader [ "Photo"];'입니다. 어쩌면 이미지를 성공적으로 저장하지 못하고있을 수도 있습니다. –
아마도 문제는 사진 필드가 얼룩인지, 그럴 수 있습니까? –
사진을 base64로 저장하지 않으면 이미지를 데이터베이스로 직접 전달해야합니까? 나는 'SaveImage (Image Pic)'와 'cmd.Parameters.Add ("@pic", DbType.Binary)를 넣어야한다;'? –