#.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 мегапикселей, и оно отлично работает.