Bitmap.GetPixel возвращает только 0 для R, G и B

Я загружаю изображение в консольное приложение, используя Image.FromFile.
После этого я привожу его к Bitmap, чтобы иметь возможность использовать метод Bitmap.GetPixel(). Удивительно, но при переборе всех пикселей все, что я получаю от GetPixel, это 0,0,0 для R,G,B.

Чтобы убедиться, что изображение хорошо читается из файла, я добавил ссылку на System.Windows.Forms и загрузил изображение внутри PictureBox, чтобы увидеть результат, и изображение хорошо видно.

Исходное изображение:

Bitmap.GetPixel возвращает только 0 для R, G и B

Вот как я загружаю изображение и показываю его в PictureBox:

Bitmap img = (Bitmap)Image.FromFile("image.png");

PictureBox pb = new PictureBox
{
    Image = img
};

Form frm = new Form
{
    Controls = { pb }
};

frm.ShowDialog();

Что показывает изображение, как оно есть:

Bitmap.GetPixel возвращает только 0 для R, G и B

И после этого я получаю такие пиксели, как:

byte[] input = new byte[784];

for (int x = 0; x < 28; x++)
{
    for (int y = 0; y < 28; y++)
    {
        Color color = img.GetPixel(x, y);
        byte r = color.R;
        byte g = color.G;
        byte b = color.B;

        Console.Write($"{color.R},{color.G},{color.B}|||");
        input[x * 28 + y] = (byte)((((r + g + b) / 3)));
    }
    Console.WriteLine();
}

Обратите внимание, что размер изображения составляет 28x28 пикселей, и я пробовал другие изображения, и у меня был тот же результат.

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


Редактировать:

Поскольку PictureBox показывает реальное представление изображения, я попытался получить пиксели из PictureBox.Image, например:

Color color = ((Bitmap)pb.Image).GetPixel(x, y);

Это также не сработало, и результаты вернулись как нули.


В чем может быть причина этого и как это исправить?

Почему это консольное приложение?

A.A. 15.05.2019 10:18

@A.A.Потому что мне не нужно ничего показывать. Это просто материал для тестирования машинного обучения, и мне нужны только данные изображения.

Paul Karam 15.05.2019 10:19

Какое расширение файла вы использовали раньше, когда оно работало? Не могли бы вы проверить свой алгоритм с файлом JPG, пожалуйста,

A.A. 15.05.2019 10:21

@A.A.I использовал его раньше с JPG и PNG, и он всегда работал, даже внутри консольного приложения.

Paul Karam 15.05.2019 10:23

Идея: откройте свое изображение в Paint или GIMP и проверьте значение RGB случайного пикселя.

A.A. 15.05.2019 10:27

Значит, это не работает только с этим одним изображением? Какие подробности? (Размер и глубина пикселей)

TaW 15.05.2019 10:34

@TaW Размер изображения 28x28, и я не подумал попробовать другое изображение. Я просто сделал это и получил тот же результат. Я также добавил эту информацию в вопрос для получения дополнительных разъяснений.

Paul Karam 15.05.2019 10:41

@PaulKaram Можешь попробовать с JPG?

A.A. 15.05.2019 10:45

Фотошоп или другая программа? Если у вас есть PhotoShop, откройте и сохраните его снова. Посмотрим, что выйдет (полагаю наоборот, все белый). Важно значение альфа.

Jimi 15.05.2019 10:55

Фактический цвет [0,255,255,255] или [0,0,0,0]. Все прозрачно.

Jimi 15.05.2019 11:01

@Jimi После открытия его в Photoshop и повторного сохранения он получился таким же, как файл. Но когда я попробовал в коде, он действительно дал правильные значения.

Paul Karam 15.05.2019 11:10

Примечание. Ваше изображение прозрачное + черное. Если не оценивать альфа-канал, все пиксели казаться черные. Более менее. Есть полупрозрачные пиксели. Однако он может просто изменить значение Alpha для их представления. Разные техники.

Jimi 15.05.2019 11:15

Пожалуйста, опубликуйте фактическое изображение png!

TaW 15.05.2019 11:21

@TaW Добавлено в пост и вот ссылка: i.stack.imgur.com/9BJBI.png

Paul Karam 15.05.2019 11:24

@PaulKaram Изображение черное из-за прозрачности, RGB выдает (0,0,0), что является черным и в данном случае правильным. Попробуйте использовать значения RGB 4-го измерения, чтобы вы также могли получить альфа-значения.

A.A. 15.05.2019 11:28

Спасибо. В нем действительно только черные пиксели. Многие из них прозрачны, что позволит задний цвет просвечивает изображения. Но все пиксели черные с разными значениями альфы. Вы можете использовать это как индикатор настоящего и фальшивого черного цвета. Так что добавляйте color.A в свои тесты!!

TaW 15.05.2019 11:28

Вы можете использовать color.A в качестве меры того, сколько фактического цвета и сколько фонового цвета вы выбрали, будет использоваться. Таким образом, расчет может выглядеть так: red = ((255- color.A) * backcolor.R + color.red * color.A )

TaW 15.05.2019 11:41

@TaW Спасибо за всю информацию. Если вы хотите опубликовать это как ответ, я буду более чем счастлив принять :)

Paul Karam 15.05.2019 11:50
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
18
334
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

В вашем изображении все цветовые каналы всех пикселей являются0, так что ваш код на самом деле работает нормально.

И у большинства пикселей также есть alpha из 0, поэтому они прозрачный. Некоторые из них полупрозрачные, со сглаженными пикселями, а некоторые полностью непрозрачны.

Там, где есть прозрачные или полупрозрачные пиксели, фон будет просвечиваться.

Если вы хотите распознать действительно непрозрачные черные пиксели, вам также необходимо проверить альфа-канал.

Вот функция, которая создаст составной цвет цвета пикселя и заданного цвета фона..:

Color Composite(Color color, Color backcolor)
{
    byte r = (byte)(((255 - color.A) * backcolor.R + color.R * color.A) / 256);
    byte g = (byte)(((255 - color.A) * backcolor.G + color.G * color.A) / 256);
    byte b = (byte)(((255 - color.A) * backcolor.B + color.B * color.A) / 256);
    Color c2 = Color.FromArgb(255, r, g, b);
    return c2;
}

Если вам нужна яркость одного из ваших пикселей, вы можете создать композицию его цвета с белым. Но, учитывая изображение, которое у вас есть, вы могли бы также использовать color.A напрямую..

Другие вопросы по теме