Поделиться через


Настройка альфа-значений отдельных пикселей

В разделе Использование цветовой матрицы для задания альфа-значений в изображениях показан неконструктивный метод изменения альфа-значений изображения. Пример в этом разделе рендерит изображение полупрозрачным, но данные пикселей в растровом изображении не изменяются. Альфа-значения изменяются только во время отрисовки.

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