这可能是不可能的,或者更确切地说,不是很受欢迎,但我想知道如何为图像创建一个数据文件,实际上可以压缩它们?假设我总共有200MB的图像文件,有没有什么系统可以用来将它们存储在单个文件中,这样就可以将它们压缩到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。:)另外,请不要评判我的代码示例的质量,这只是一个模型,我是即兴编写的。
干杯,提前谢谢你。
发布于 2012-06-11 20:00:06
如果将图像保存为二进制文件会有帮助,这是我用来将它们转换为二进制文件,然后保存为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();
}EDIT 2尝试执行以下操作,以查看您尝试加载的数据类型:
System.Type checkType = rdr[0].GetType();
pictureBox1.Image = ByteToImage((System.Byte[])rdr[0]);在代码中添加第一行,并在该行中放置断点。检查checkType的类型。可能它不是二进制的。让我知道结果,以帮助你。
发布于 2012-06-11 19:53:10
查看这篇文章:http://msdn.microsoft.com/en-us/library/aa479502.aspx
我希望它能帮上忙。从ZIP访问文件的想法。它不是现成的解决方案,而是一个很好的概念解释。
https://stackoverflow.com/questions/10979450
复制相似问题