Просто же - замени в "Color.FromArgb(a, 0, 0, 0)" нули на нужный тебе цвет, к которому должно стремиться, например "Color.FromArgb(a, 255, 255, 255)".
Простой пример на VB6:
Функция определяет принадлежность точки полигону, даже не выпуклому:
Код
Function PointInPolygon(ByVal X As Single, ByVal Y As Single) As Boolean Dim n1 As Long, n2 As Long, f As Boolean For n1 = 0 To vCnt - 1 n2 = (n1 + 1) Mod vCnt If (Y > V(n1).Y) Xor (Y > V(n2).Y) Then If X > V(n1).X + (V(n2).X - V(n1).X) * (Y - V(n1).Y) / (V(n2).Y - V(n1).Y) Then f = Not f End If End If Next n1 PointInPolygon = f End Function
vCnt - число вершин полигона. V() - массив векторов вершин. Просто и эффективно.
Простой пример на C++:
Функция быстро масштабирует с билинейной фильтрацией ARGB изображение (естественно XRGB или 32 бит RGB тоже). Одна из причин быстродействия - используется ТОЛЬКО целочисленная математика. Так же - память под локальные массивы выделяется на стэке. Ну и сам алгоритм продуман. Возможен разный масштаб по вертикали и по горизонтали:
Код
void RESIZE(unsigned char* src, unsigned char* dest, int ws, int hs, int wd, int hd) { int xx, yy; int x, y; int ixx, iyy; int ix, iy; int cx, cy; int cxy, cc; int pin, pout, p; int b, g, r, a; int *ikx, *iky; int *kx, *ky;
cx = (ws - 1) / wd + 2; cy = (hs - 1) / hd + 2; x = cx * wd; y = cy * hd;
if (ws >= wd) { cxy = ws; pin = 0; pout = 1; p = 0; for(;;) { cc = pout * ws - pin * wd; if (cc >= wd) { kx[p] = wd; } else { kx[p] = cc; ikx[p] = pin; p = pout * cx; pout += 1; kx[p] = wd - cc; } ikx[p] = pin; pin += 1; if (pin >= ws) break; p += 1; } } else { cxy = wd; for (x = 0; x < wd; x++) { p = x * 2; kx[p + 1] = x * (ws - 1) % (wd - 1); ikx[p] = x * (ws - 1) / (wd - 1); kx[p] = wd - kx[p + 1]; ikx[p + 1] = (ikx[p] + 1) % ws; } }
if (hs >= hd) { cxy *= hs; pin = 0; pout = 1; p = 0; for(;;) { cc = pout * hs - pin * hd; if (cc >= hd) { ky[p] = hd; } else { ky[p] = cc; iky[p] = pin; p = pout * cy; pout += 1; ky[p] = hd - cc; } iky[p] = pin; pin += 1; if (pin >= hs) break; p += 1; } } else { cxy *= hd; for (y = 0; y < hd; y++) { p = y * 2; ky[p + 1] = y * (hs - 1) % (hd - 1); iky[p] = y * (hs - 1) / (hd - 1); ky[p] = hd - ky[p + 1]; iky[p + 1] = (iky[p] + 1) % hs; } }
iyy = 0; for (yy = 0; yy < hd; yy++) { ixx = 0; for (xx = 0; xx < wd; xx++) { b = g = r = a = 0; iy = iyy; for (y = 1; y <= cy; y++) { ix = ixx; for (x = 1; x <= cx; x++) { b += src[(ikx[ix] + iky[iy] * ws) * 4 + 0] * kx[ix] * ky[iy]; g += src[(ikx[ix] + iky[iy] * ws) * 4 + 1] * kx[ix] * ky[iy]; r += src[(ikx[ix] + iky[iy] * ws) * 4 + 2] * kx[ix] * ky[iy]; a += src[(ikx[ix] + iky[iy] * ws) * 4 + 3] * kx[ix] * ky[iy]; ix += 1; } iy += 1; } dest[(xx + yy * wd) * 4 + 0] = b / cxy; dest[(xx + yy * wd) * 4 + 1] = g / cxy; dest[(xx + yy * wd) * 4 + 2] = r / cxy; dest[(xx + yy * wd) * 4 + 3] = a / cxy; ixx += cx; } iyy += cy; } return; }
*src - указатель на массив источник, *dest - указатель на массив приёмник. ws, hs - ширина и высота изображения в массиве источнике. wd, hd - то же для массива приёмника.