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和位图是工程和科学场景中常用的格式。这只是一个简单的测试,看看相机功能是否正常。