2010-07-26 4 views
1

Я могу сохранить захваченное изображение со сканера штрих-кода, используя этот код:Дисплей захватил Jpeg файл

 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); 
     }); 

Вот изображение, которое я вижу. Это должна быть черно-белая фотография коробки клинеекса.

alt text

Вот сохраненный файл JPG: alt text

+0

Если вы разрабатываете сканер штрих-кода, вы должны переключиться на формат без потерь, например, tiff или bitmap. jpeg-изображения оптимизированы для захвата изображений, которые нужно просматривать глазами человека. tiff и bitmap - это форматы, обычно используемые в инженерных и научных сценариях. – MedicineMan

+0

Это просто простой тест, чтобы узнать, работают ли функции камеры или нет. – Robert

ответ

0

Я использовал 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); 
    }); 
0

это, скорее всего, искажая его

myImage.Stretch = Stretch.Fill; 
+0

Я включил изображение отклоненного изображения. – Robert

+0

@Robert ах, неважно. Я неправильно понял, что вы имели в виду под искажением. –

2

вы перепутать ширину и высоту? вы уверены, что значение вашего значения верно?

Я подозреваю, что вся проблема эта линия:

 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)

В принципе, как я смотрю на это, что вы подаете в библиотеку растрового изображения поток битов ... он не знает, что бит, но он попытается создать изображение из информации, которую вы ему даете: бит на пиксель, размер и т. д. Если вы сообщите ему неправильную информацию, он создаст поврежденное изображение, как вы показали.

Я немного подозрительно, что проблема не в ширине и высоте; даже если вы смешаете эти два значения - я думаю, вы получите по крайней мере часть первой строки пикселей, которые будут отображаться правильно. Я вижу статический/шум/снег, который говорит мне, что есть что-то о том, как интерпретируется поток бит - он отображается как случайные черные и белые.

Другое дело: в крышке экрана я вижу цвет. это еще один намек на то, что в ваших предположениях о изображении есть что-то неправильное. Значения должны, вероятно, от 1 до 256 (8 бит на пиксель, я думаю?) Я бы попытался создать черно-белое растровое изображение размером 8 бит на пиксель. Как-то библиотека думает, что это цветное изображение.

Я только заметил, что вы принимаете jpeg. jpeg - формат с потерями - я бы предположил, что у вас получится растровое или tiff-изображение. дважды проверьте, что вы действительно возвращаете изображение jpeg (проверьте документацию api штрих-кода)

+0

Я загрузил рабочий файл jpeg. – Robert

+0

Переключение высоты/ширины не имеет значения. Я изменил PixelFormats.Bgr24 на PixelFormats.Grey8 (так как это 8-битное изображение), не работает. Информация о шаге, которую я не знаю, как вычислить, поэтому я просто использовал ту же информацию о шаге из примера, который я использовал. К сожалению, у меня нет доступа к информации API. – Robert

1

Алгоритм сжатия JPEG совершенно непригоден для того изображения, которое вы захватываете. Он хорошо работает для фотографий, он плохо работает на изображениях, содержащих тонкие линии. Небольшие артефакты, создаваемые сжатием, значительно усложняют сканирование штрих-кода.

Вы не видите окно Kleenex, потому что вы пишете байты необработанного изображения. Вам нужно использовать кодировщик изображения. Я рекомендую вам использовать класс PngBitmapEncoder. GifBitmapEncoder должен работать, так как вам не нужно много цветов, он делает файлы меньшего размера. Фрагмент кода, показывающий, как использовать кодировщик, - available here.

Смежные вопросы