WPF JpegBitmapDecoder, создающий разную высоту и ширину

#.net #wpf #image #image-processing #jpeg

#.net #wpf #изображение #обработка изображений #jpeg

Вопрос:

Я пытаюсь прочитать изображение в формате Jpeg и привязать его к свойству заполнения прямоугольника с помощью следующего кода:

 Dim filePath as string = "PathToJpeg.jpg"     
Dim imageStreamSource As New FileStream(filePath, FileMode.Open, FileAccess.Read, FileShare.Read)
Dim decoder As New JpegBitmapDecoder(imageStreamSource, BitmapCreateOptions.PreservePixelFormat, BitmapCacheOption.Default)
Dim bitmapSource As BitmapSource = decoder.Frames(0)
  

Когда я читаю это с меньшими изображениями, это работает нормально. Но когда я указываю на изображение размером 3840 на 3024, bitmmapSource.Height считывается 924 и bitmapSource.Width считывается 1174

Из того, что я могу сказать, это почти как 1024×768 — это верхний предел

Я упускаю что-то очевидное здесь?

Комментарии:

1. Я полагаю, что ваш sorce jpeg получен от сканера (~ 300 точек на дюйм)? В этом случае результаты вполне ожидаемы, потому что BitmapSource . Свойство Width возвращает ширину растрового изображения в не зависящих от устройства единицах (1/96 дюйма на единицу). Пожалуйста, попробуйте BitmapSource. pixelWidth / BitmapSource. Свойства DpiX…

2. @Saint Domino: ссылаясь на ваш комментарий о вознаграждении, вы говорите, что считаете, что загрузка JPEG непосредственно в растровое изображение является взломом, тогда как использование JpegBitmapDecoder не является взломом? Я бы, наверное, подумал наоборот.

3. ДА. Моя конечная цель здесь — загрузить jpeg из файловой системы и использовать его в качестве заполнения прямоугольника WPF, сохраняя исходную высоту и ширину. Мне не нужно было прибегать к GDI (и добавлять сборку system.drawing), чтобы сделать это. Я могу использовать систему. Рисование. Растровое изображение … но для этого сценария мне не нужно. Вот почему я думаю, что это хак.

Ответ №1:

Я действительно не знаю, почему вы явно используете JpegBitmapDecoder. Мой код на C # для этого довольно прост:

 BitmapSource bitmapSource = new BitmapImage(new Uri(@"PathToJpeg.jpg"));
  

Класс BitmapSource предлагает два свойства width и height:

Width: возвращает ширину растрового изображения в не зависящих от устройства единицах (1/96 дюйма на единицу). (Из MSDN)

pixelWidth: возвращает ширину растрового изображения в пикселях.(Из MSDN)

Я протестировал это с изображением на 111 мегапикселей, и оно отлично работает.