Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/268.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 显示捕获的Jpeg文件_C#_Wpf_Jpeg - Fatal编程技术网

C# 显示捕获的Jpeg文件

C# 显示捕获的Jpeg文件,c#,wpf,jpeg,C#,Wpf,Jpeg,我可以使用以下代码保存从条形码扫描仪捕获的图像: Microsoft.Win32.SaveFileDialog dlg = new Microsoft.Win32.SaveFileDialog(); dlg.DefaultExt = ".jpg"; dlg.Filter = "JPEG Images (.jpg)|*.jpg|All files (*.*)|*.*"; if (dlg.ShowDialog() == true)

我可以使用以下代码保存从条形码扫描仪捕获的图像:

        Microsoft.Win32.SaveFileDialog dlg = new Microsoft.Win32.SaveFileDialog();
        dlg.DefaultExt = ".jpg";
        dlg.Filter = "JPEG Images (.jpg)|*.jpg|All files (*.*)|*.*";
        if (dlg.ShowDialog() == true)
        {
            using (FileStream file = File.OpenWrite(dlg.FileName))
            {
                file.Write(e.ImageBuffer, 0, e.ImageSize);
            }
        }
但是,我想使用WPF显示捕获的图像,但得到的图像失真

private void _barcodeScannerInstance_SavePhotoEvent(object sender, ImageEventArgs e)
    {   
        SetBitmap(e.ImageBuffer, 350, 263, 96);

    }


 private void SetBitmap(byte[] image, int width, int height, int dpi)
      {
        MainWindow.Instance.Dispatcher.Invoke(DispatcherPriority.Normal, (ThreadStart)delegate()
        {
            BitmapSource bitmapSource = BitmapSource.Create(
            width, height, (double)dpi, (double)dpi, PixelFormats.Bgr24, null, image, ((width * 24 + 31) & ~31) >> 3);                

            HwModeScreen.BarcodeImageCanvas.Children.Clear();
            Image myImage = new Image();
            myImage.Width = HwModeScreen.BarcodeImageCanvas.ActualWidth;
            myImage.Height = HwModeScreen.BarcodeImageCanvas.ActualHeight;
            myImage.Stretch = Stretch.Fill;
            myImage.Source = bitmapSource;
            HwModeScreen.BarcodeImageCanvas.Children.Add(myImage);
        });
这是我看到的图像。它应该是一张纸巾盒的黑白照片

以下是保存的jpg文件:

这可能会扭曲它

myImage.Stretch = Stretch.Fill;

你把宽度和高度弄混了吗?您确定您的dpi值正确吗

我怀疑整个问题在于这一行:

        BitmapSource bitmapSource = BitmapSource.Create(
        width, height, (double)dpi, (double)dpi, PixelFormats.Bgr24, null, image, ((width * 24 + 31) & ~31) >> 3)
要调试这个问题,我要做的是将图像写入文件并确认所有输入。使用photoshop、paint.net、文件属性。。。 您确定正在使用位图格式吗? 您确定使用的是每像素24位吗? 您确定高度和宽度正确,并且将值输入到正确的参数中吗

这句话是关于什么的?你为什么要这么做?我有点怀疑。 ((宽度*24+31)和~31)>>3)

基本上,我看这个的方式是,你正在给位图库提供一个比特流。。。它不知道位是什么,但它将尝试根据您提供的信息创建图像:每像素位、大小等。如果您提供的信息不正确,它将创建损坏的图像,如您所示

我有点怀疑问题不在于宽度和高度;即使你把这两个值混合在一起——我想你至少会得到第一行像素的一部分被正确渲染。我看到了static/noise/snow,这告诉我比特流的解释方式有一些问题——它被渲染为随机的黑白

另一件事:在你的屏幕上,我看到了颜色。这是另一个提示,说明您对图像的假设有误。值应该是1到256(我想是每像素8位吧?),我会尝试创建一个每像素8位的黑白位图。不知怎的,图书馆认为这是一个彩色图像


我刚刚注意到您正在使用jpeg。jpeg是一种有损格式——我假设最终会得到位图或tiff图像。仔细检查您是否确实正在返回jpeg图像(请查看条形码api文档)

jpeg压缩算法不适合您所捕获的图像类型。它适用于照片,在包含细纹的图像上表现不佳。压缩产生的轻微伪影使正确扫描条形码变得困难得多


您没有看到纸巾盒,因为您正在写入原始图像字节。您需要使用图像编码器。我建议您使用PngBitmapEncoder类。GifBitmapEncoder也应该可以工作,因为您不需要很多颜色,它可以生成更小的文件。显示如何使用编码器的代码片段是。

我使用了jpeg解码器来解决这个问题

  private void SetBitmap(byte[] image, int width, int height, int dpi)
  {
    MainWindow.Instance.Dispatcher.Invoke(DispatcherPriority.Normal, (ThreadStart)delegate()
    {
        BMemoryStream ms = new MemoryStream(image);
        JpegBitmapDecoder decoder = new JpegBitmapDecoder(ms, BitmapCreateOptions.PreservePixelFormat, BitmapCacheOption.Default);
        BitmapSource bitmapSource = decoder.Frames[0];               

        HwModeScreen.BarcodeImageCanvas.Children.Clear();
        Image myImage = new Image();
        myImage.Width = HwModeScreen.BarcodeImageCanvas.ActualWidth;
        myImage.Height = HwModeScreen.BarcodeImageCanvas.ActualHeight;
        myImage.Stretch = Stretch.Fill;
        myImage.Source = bitmapSource;
        HwModeScreen.BarcodeImageCanvas.Children.Add(myImage);
    });

我包括了一张被破坏的照片。@Robert啊,没关系。我误解了你所说的失真。切换高度/宽度没有什么区别。我将PixelFormats.Bgr24更改为PixelFormats.Grey8(因为它是8位图像),但不起作用。步幅信息我不知道如何计算,所以我只是使用了下面一个例子中相同的步幅信息。很遗憾,我无法访问API信息。如果您正在开发条形码扫描仪,则应切换到无损格式,如tiff或位图。jpeg图像经过优化,可捕获人眼观看的图像。tiff和位图是工程和科学场景中常用的格式。这只是一个简单的测试,看看相机功能是否正常。