Настройка альфа-значений отдельных пикселей
В разделе Использование цветовой матрицы для задания альфа-значений в изображениях показан неконструктивный метод изменения альфа-значений изображения. Пример в этом разделе рендерит изображение полупрозрачным, но данные пикселей в растровом изображении не изменяются. Альфа-значения изменяются только во время отрисовки.
В следующем примере показано, как изменить альфа-значения отдельных пикселей. Код в примере фактически изменяет альфа-данные в объекте bitmap. Подход гораздо медленнее, чем использование цветовой матрицы и ImageAttributes объект, но позволяет управлять отдельными пикселями в растровом изображении.
INT iWidth = bitmap.GetWidth();
INT iHeight = bitmap.GetHeight();
Color color, colorTemp;
for(INT iRow = 0; iRow < iHeight; iRow++)
{
for(INT iColumn = 0; iColumn < iWidth; iColumn++)
{
bitmap.GetPixel(iColumn, iRow, &color);
colorTemp.SetValue(color.MakeARGB(
(BYTE)(255 * iColumn / iWidth),
color.GetRed(),
color.GetGreen(),
color.GetBlue()));
bitmap.SetPixel(iColumn, iRow, colorTemp);
}
}
// First draw a wide black line.
Pen pen(Color(255, 0, 0, 0), 25);
graphics.DrawLine(&pen, 10, 35, 200, 35);
// Now draw the modified bitmap.
graphics.DrawImage(&bitmap, 30, 0, iWidth, iHeight);
На следующем рисунке показан полученный рисунок.
В предыдущем примере кода используются вложенные циклы для изменения альфа-значения каждого пикселя в растровом рисунке. Для каждого пикселя Bitmap::GetPixel получает существующий цвет, Color::SetValue создает временный цвет, содержащий новое альфа-значение, а затем Bitmap::SetPixel задает новый цвет. Альфа-значение задается на основе столбца растрового изображения. В первом столбце альфа-значение равно 0. В последнем столбце значение альфа-канала установлено на 255. Таким образом, полученное изображение переходит от полностью прозрачного (на левом крае) до полностью непрозрачного (на правом краю).
bitmap::GetPixel и Bitmap::SetPixel позволяют управлять отдельными значениями пикселей. Однако использование Bitmap::GetPixel и Bitmap::SetPixel не так быстро, как использование классаImageAttributesImageAttributes и структуры ColorMatrix.