首页 > 解决方案 > SQL 拍摄图像很慢

问题描述

我每分钟将图像写入 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()

标签: sql-servervb.netimage

解决方案


原因.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或类似模式)来增加客户端-服务器连接的弹性。


推荐阅读