带压缩的可保存图像库

本文关键字:图像 可保存 带压缩 | 更新日期: 2023-09-27 18:36:43

这可能

是不可能的,或者更确切地说,不是很受欢迎,但我想知道如何为图像创建一个数据文件,以实际压缩它们?假设我总共有 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。:)另外,请不要判断我的代码示例的质量,它只是一个模型,我把它写出来了。

干杯,提前感谢。

带压缩的可保存图像库

如果将图像另存为二进制文件会有所帮助,这是我用来将它们转换为二进制然后保存到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]);

在代码中添加第一行,并在该行中放置断点。检查类型类型。可能它不是二进制的。让我知道结果以帮助您。

查看这篇文章: http://msdn.microsoft.com/en-us/library/aa479502.aspx

我希望它有所帮助。从 ZIP 访问文件的想法。这不是现成的解决方案,但是一个很好的概念解释。