Я хотел бы в коде и по запросу преобразовать 32-битный объект изображения RGBA (изначально 32-битный PNG) в его 32-битный аналог в градациях серого.
Я уже прочитал несколько другие вопросы здесь, а также множество статей в Интернете. Я пробовал использовать ColorMatrix для этого, но, похоже, он не очень хорошо справляется с альфа-каналом. Пиксели, которые полностью непрозрачны, идеально подходят для оттенков серого. Кажется, что любой частично прозрачный пиксель плохо транслируется, поскольку в этих пикселях все еще есть оттенки цвета. Достаточно быть заметным.
ColorMatrix, который я использую, выглядит следующим образом:
new System.Drawing.Imaging.ColorMatrix(new float[][]{
new float[] {0.299f, 0.299f, 0.299f, 0, 0},
new float[] {0.587f, 0.587f, 0.587f, 0, 0},
new float[] {0.114f, 0.114f, 0.114f, 0, 0},
new float[] { 0, 0, 0, 1, 0},
new float[] { 0, 0, 0, 0, 1}
});
Как я читал, это довольно стандартная взвешенная матрица NTSC. Затем я использую его вместе с Graphics.DrawImage
, но, как я уже сказал, частично прозрачные пиксели все еще окрашены. Я должен указать, что это отображение объекта Image через WinForms PictureBox
на белом фоне. Может быть, это просто способ, которым PictureBox рисует свои изображения и обрабатывает прозрачные части? Цвета фона не влияют на это (оттенок цвета точно от исходного изображения), но, возможно, PictureBox неправильно перерисовывает прозрачные пиксели?
Я видел несколько методов, которые используют FormatConvertedBitmap вместе с OpacityMask. Я не пробовал, в основном потому, что я бы предпочел не импортировать PresentationCore.dll (не говоря уже о том, что это не будет работать в ограниченных приложениях .NET 2.0). Разве базовый материал System.Drawing. * Может выполнить эту простую процедуру? Или нет?