Существует множество алгоритмов для изменения размера изображения - lancorz, bicubic, bilinear, например. Но большинство из них довольно сложны и поэтому потребляют слишком много CPU .
Мне нужен быстрый относительно простой код C ++ для изменения размера изображений с приемлемым качеством .
Вот пример того, что я сейчас делаю:
for (int y = 0; y < height; y ++)
{
int srcY1Coord = int((double)(y * srcHeight) / height);
int srcY2Coord = min(srcHeight - 1, max(srcY1Coord, int((double)((y + 1) * srcHeight) / height) - 1));
for (int x = 0; x < width; x ++)
{
int srcX1Coord = int((double)(x * srcWidth) / width);
int srcX2Coord = min(srcWidth - 1, max(srcX1Coord, int((double)((x + 1) * srcWidth) / width) - 1));
int srcPixelsCount = (srcX2Coord - srcX1Coord + 1) * (srcY2Coord - srcY1Coord + 1);
RGB32 color32;
UINT32 r(0), g(0), b(0), a(0);
for (int xSrc = srcX1Coord; xSrc <= srcX2Coord; xSrc ++)
for (int ySrc = srcY1Coord; ySrc <= srcY2Coord; ySrc ++)
{
RGB32 curSrcColor32 = pSrcDIB->GetDIBPixel(xSrc, ySrc);
r += curSrcColor32.r; g += curSrcColor32.g; b += curSrcColor32.b; a += curSrcColor32.alpha;
}
color32.r = BYTE(r / srcPixelsCount); color32.g = BYTE(g / srcPixelsCount); color32.b = BYTE(b / srcPixelsCount); color32.alpha = BYTE(a / srcPixelsCount);
SetDIBPixel(x, y, color32);
}
}
Приведенный выше код достаточно быстр: , но при увеличении изображения качество не очень хорошее.
Поэтому, возможно, у кого-то уже есть быстрый и хороший пример кода C ++ для масштабирования DIB?
Примечание: раньше я использовал StretchDIBits - это было очень медленно, когда нужно было уменьшить размер изображения 10000x10000 до размера 100x100, мой код намного, намного быстрее, я просто хочу иметь немного больше качество
P.S. Я использую свои собственные функции SetPixel / GetPixel, чтобы работать напрямую с массивом данных и быстро, это не контекст устройства!