【问题标题】:SQL taking images is very slowSQL 拍摄图像很慢
【发布时间】:2019-12-04 09:08:22
【问题描述】:

我每分钟将图像写入 SQL Server 数据库,然后我每分钟通过客户端应用程序读取这些图像。

这是我如何将图像放入数据库的代码:

PictureBox1.Image.Save(mstream, System.Drawing.Imaging.ImageFormat.Bmp)
arrimage = mstream.GetBuffer()

drNowyWiersz3 = m_tabeladanych3.NewRow()
drNowyWiersz3("Id") = k
drNowyWiersz3("bitmap") = arrimage

m_tabeladanych3.Rows.Add(drNowyWiersz3)
drNowyWiersz3 = Nothing

drNowyWiersz3 是数据表的新行。

m_tabeladanych3 是数据表。

我有 6 张这样的图片(每张大约 8kb)。拍摄这些图像有时需要 1 分钟 (!),尤其是当我通过 Wi-Fi 连接时,它会导致应用程序错误。

当图像格式为.jpeg但图像模糊时情况会好得多。

如何改进流程?

编辑:

这是我用来读取图像的代码,也许这是问题所在?

Dim lb2() As Byte = m_tabeladanych3.Rows(1)("bitmap")
Dim lstr2 As New System.IO.MemoryStream(lb2)
PictureBox2.Image = Image.FromStream(lstr2)
lstr2.Close()

【问题讨论】:

  • 考虑使用arrimage = mstream.ToArray() 而不是arrimage = mstream.GetBuffer()。这样,您只存储图像数据,而不是包含未使用字节的整个缓冲区。
  • 我会尝试在我的代码中更改它。谢谢。

标签: sql-server vb.net image


【解决方案1】:

.jpeg 的性能优于 .bmp 的原因是第一个是压缩文件格式,而第二个不是。

为了改进您的设置,我将执行以下操作:

  1. 在将图像保存到数据库之前对其进行压缩
  2. 让客户端检索压缩文件,在客户端解压缩并显示 它

作为一个例子,我使用了标准库:

using System.IO;
using System.IO.Compression;

这使您可以执行以下操作:

private void compressButton_Click(object sender, EventArgs e)
{
    // Test image to compress:
    FileInfo imageInfo = new FileInfo(@"C:\Temp\test.bmp");

    // Compress image
    using (FileStream imageToCompress = imageInfo.OpenRead())
    using (FileStream gzippedImage = File.Create(imageInfo.FullName + ".gz"))
    using (GZipStream gZipStream = new GZipStream(gzippedImage, CompressionMode.Compress))
        imageToCompress.CopyTo(gZipStream);

    Console.WriteLine("Test image compressed using Gzip...");

    // Delete original image
    File.Delete(imageInfo.FullName);
}
private void decompressButton_Click(object sender, EventArgs e)
{
    // Test image to decompress:
    FileInfo imageInfo = new FileInfo(@"C:\Temp\test.bmp.gz");

    // Decompress image
    using (FileStream imageToDecompress = imageInfo.OpenRead())
    using (FileStream decompressedImage = File.Create(imageInfo.FullName.Replace(".gz", ""))) // There are a million other ways to do this, but hey ...
    using (GZipStream gZipStream = new GZipStream(imageToDecompress, CompressionMode.Decompress))
        gZipStream.CopyTo(decompressedImage);

    Console.WriteLine("Gzipped test image decompressed...");

    // Delete gzip
    File.Delete(imageInfo.FullName);
}

除了在这种情况下使用压缩数据之外,您还可以通过在读取/写入时使用异步流(即使用 Stream.ReadAsyncStream.WriteAsync 或类似模式)来增加客户端-服务器连接的弹性。

【讨论】:

    猜你喜欢
    • 2013-03-20
    • 2020-07-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-05-29
    相关资源
    最近更新 更多