Я хотел бы в коде и по требованию преобразовать 32-разрядный объект RGBA Image (первоначально 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 вдольс непрозрачностью маски.Я не пробовал, главным образом потому, что я действительно предпочел бы не импортировать PresentationCore.dll (не говоря уже о том, что он не будет работать в приложениях с ограничением .NET 2.0).Наверняка основные вещи System.Drawing. * Могут сделать эту простую процедуру?Или нет?