Расчет цвета пикселей от 255 до 0 - PullRequest
1 голос
/ 03 октября 2011

Я использовал алгоритм от Microsoft здесь :

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);
   }
}

для создания градиентной альфа-смеси. Они идут слева направо, мне нужно один, идущий снизу вверх, поэтому я изменил их линию

(BYTE)(255 * iColumn / iWidth)

до

(BYTE)(255 - ((iRow * 255) / iHeight))

Это делает строку 0 альфа 255, до последней строки, имеющей альфа 8.

Как мне изменить расчет, чтобы альфа перешла с 255 на 0 (вместо 255 на 8)?

Ответы [ 3 ]

0 голосов
/ 03 октября 2011
(BYTE)( 255 - 255 * iRow / (iHeight-1) )

iRow находится между 0 и (iHeight-1), поэтому, если мы хотим получить значение от 0 до 1, нам нужно разделить на (iHeight-1). На самом деле нам нужно значение от 0 до 255, поэтому мы просто увеличиваем на 255. Наконец, мы хотим начать с максимума и опуститься до минимума, поэтому мы просто вычтем значение из 255.

В конечных точках:

iRow = 0
    255 - 255 * 0 / (iHeight-1) = 255
iRow = (iHeight-1)
    255 - 255 * (iHeight-1) / (iHeight-1) = 255 - 255 * 1 = 0

Обратите внимание, что iHeight должно быть больше или равно 2, чтобы это работало (вы получите деление на ноль, если оно равно 1).

Edit: Это приведет к тому, что только последняя строка будет иметь альфа-значение 0. Вы можете получить более равномерное распределение альфа-значений с помощью

(BYTE)( 255 - 256 * iRow / iHeight )

однако, если iHeight меньше 256, последняя строка не будет иметь альфа-значение 0.

0 голосов
/ 03 октября 2011

Попробуйте использовать один из следующих расчетов (они дают одинаковый результат):

(BYTE)(255 - (iRow * 256 - 1) / (iHeight - 1))
(BYTE)((iHeight - 1 - iRow) * 256 - 1) / (iHeight - 1))

Это будет работать только при использовании подписанного деления (вы используете тип INT, который, похоже, совпадает с int, поэтому он должен работать).

0 голосов
/ 03 октября 2011

f(x) = 255 * (x - 8) / (255 - 8)?

Где x в [8, 255] и f (x) в [0, 255]

Первоначальная проблема, вероятно, связана с тем, чтоесли у вас ширина 100 и вы перебираете горизонтальные пиксели, вы получите только значения от 0 до 99. Таким образом, деление 99 на 100 никогда не равно 1. Что вам нужно, это что-то вроде 255*(column+1)/width

...