Установка альфа-значений отдельных пикселей
В разделе Использование цветовой матрицы для задания альфа-значений на изображениях показан неразрушительный метод изменения альфа-значений изображения. В примере в этом разделе изображение отображается полупрозрачно, но пиксельные данные на растровом рисунке не изменяются. Альфа-значения изменяются только во время отрисовки.
В следующем примере показано, как изменить альфа-значения отдельных пикселей. Код в примере фактически изменяет альфа-данные в объекте 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 выполняется не так быстро, как использование класса ImageAttributes и структуры ColorMatrix .