Mark Stringer Ответов: 1

C# проверка битовой глубины изображения путаница


Привет

Для приложения C3 WPF, которое я создал для удаления повторяющихся или утомительных заданий на работе, меня путают с частью, которая настроена на проверку битовой глубины изображения.

При проверке свойств файла изображения вручную для предполагаемого изображения он четко показывает 24 через Свойства папки widows. когда одно и то же изображение проверяется с помощью моего кода, отображается результат 32.

Мое кодирование ниже было упрощено с удалением цикла папок и списка для целей тестирования и добавлением окна сообщения только для того, чтобы дать мне результат. Я все еще получаю результат 32-битной глубины .

Я неправильно кодирую или смотрю на неправильное свойство BitDepth=BitsPerPixel?
Или есть другой способ получить нужный мне результат?

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

Заранее спасибо за любую помощь/комментарии,

Марк

Что я уже пробовал:

string ima = @"E:\Images\ImagesLM\44005W30.jpg";
var source = new BitmapImage(new Uri(ima));
 bitsPerPixel = source.Format.BitsPerPixel;
 MessageBox.Show(bitsPerPixel.ToString());

1 Ответов

Рейтинг:
1

OriginalGriff

24-битное JPG-изображение имеет один байт на пиксель-красный, зеленый и синий - в общей сложности 24 бита, поэтому отображаемая "информация о диске" верна.
Но ... 32-битная информация, которую дает BitsPerPixel, также верна!
Причина в том, что растровое изображение Windows также имеет Альфа-канал, который обеспечивает слой прозрачности, которого нет в файле JPG. Когда вы загружаете JPG в растровое изображение, для вас создается равномерный Альфа-канал "полной интенсивности", принимая количество бит на пиксель равным 32. (Отсюда и термин "ARGB", который вы, возможно, тоже видели.

Вы также должны знать, что при обработке этих изображений JPEG является "форматом сжатия с потерями", поэтому загрузка изображения JPEG в растровое изображение и повторное сохранение его в виде файла JPG приведет к значительной потере детализации. Если вы хотите обрабатывать изображения повторно, вы вообще не должны использовать JPEG!

ОБНОВЛЕНИЕ
Вы можете найти это полезным:

/// <summary>
/// Gets the display size for a video or image file
/// </summary>
/// <remarks>
/// ShellObject and IShellProperty require the Microsoft Windows API Code Pack:
/// http://msdn.microsoft.com/en-us/library/ff356173(v=vs.110).aspx
/// Add references to both:
///    Microsoft.WindowsAPICodePack.DLL
///    Microsoft.WindowsAPICodePack.shell.DLL
/// </remarks>
/// <param name="filename">Full path to file</param>
/// <returns>The display size for a known video or image file</returns>
public static Size GetDisplaySize(string filename)
    {
    int height = 0;
    int width = 0;
    try
        {
        if (System.IO.File.Exists(filename))
            {
            using (ShellObject so = ShellObject.FromParsingName(filename))
                {
                if (so != null)
                    {
                    string type = (string)so.Properties.GetProperty("System.KindText").ValueAsObject;
                    switch (type)
                        {
                        case "Video":
                            height = Convert.ToInt32(so.Properties.GetProperty(SystemProperties.System.Video.FrameHeight).ValueAsObject);
                            width = Convert.ToInt32(so.Properties.GetProperty(SystemProperties.System.Video.FrameWidth).ValueAsObject);
                            break;
                        case "Picture":
                            height = Convert.ToInt32(so.Properties.GetProperty(SystemProperties.System.Image.VerticalSize).ValueAsObject);
                            width = Convert.ToInt32(so.Properties.GetProperty(SystemProperties.System.Image.HorizontalSize).ValueAsObject);
                            break;
                        case "Music":
                            break;
                        default:
                            break;
                        }
                    }
                }
            }
        }
    catch { }       // Don't care what the problem is, I can't deal with it here!
    if (width > 0 && height > 0) return new Size(width, height);
    return new Size(0, 0);
    }

Он использует кодовый пакет Microsoft Windows API для чтения информации непосредственно из файла через систему-и системные свойства.Система.Перечисление изображений включает в себя информацию о глубине пикселей, которая может дать вам то, что вы хотите.


Mark Stringer

Вау, Спасибо за отличный информационный отклик. Нет, я не знал, что он добавил альфа-канал, увеличив 8 бит.
Что касается ваших комментариев о том, что вы не используете JPEG, то, к сожалению, у меня нет такого выбора, так как программное обеспечение, используемое на моем рабочем месте, подходит только для 24-битных изображений. Иногда клиент может отправить 32-битное изображение, которое не работает в программе. Приложение, которое я создал, предназначено для сокращения моих человеко-часов и повторяющейся работы. Поэтому просто для проверки изображения, поставляемого заказчиком, подходит программное обеспечение рабочего места.

Я думаю, мне нужно будет найти другой способ проверить битовую глубину изображения Jpeg.

Спасибо за информацию.
Очень ценю.

OriginalGriff

Пожалуйста!

OriginalGriff

Ответ обновлен.

Mark Stringer

Спасибо за обновление, к сожалению, прокомментированная веб-страница msdn больше не доступна, и я не смог найти ссылки на API. После некоторого дальнейшего поиска в Google я прочитал несколько форумов, где люди говорили, что Microsoft удалила этот кодовый пакет.
Очень признателен за вашу помощь и комментарии.

OriginalGriff

Немного возится! :смеяться:
Попробовать это:
https://github.com/dbarros/WindowsAPICodePack