Мне кажется, вы, вероятно, максимально использовали FreeImage.
Источник FreeImage (http://freeimage.sourceforge.net/download.html, BitmapAccess.cpp :: FreeImage_AllocateT), по-видимому, неправильно размещает хранилище изображений как одномерный массив:
unsigned dib_size = FreeImage_GetImageSize(width, height, bpp);
bitmap->data = (BYTE *)FreeImage_Aligned_Malloc(dib_size * sizeof(BYTE), FIBITMAP_ALIGNMENT);
Здесь dib_size - это «размер битмапа, не зависящий от устройства», а bpp - «бит на пиксель».
Я предполагаю, что вы используете PixelAccess.cpp :: FreeImage_GetScanLine (), чтобы получить строку для копирования:
BYTE * DLL_CALLCONV
FreeImage_GetScanLine(FIBITMAP *dib, int scanline) {
return (dib) ? CalculateScanLine(FreeImage_GetBits(dib), FreeImage_GetPitch(dib), scanline) : NULL;
}
который звонит
inline unsigned char *
CalculateScanLine(unsigned char *bits, unsigned pitch, int scanline) {
return (bits + (pitch * scanline));
}
, который выглядит как O (1) для поиска на основе массива.
Поскольку FreeImage внутренне использует хранилище статических одномерных массивов, не совсем понятно, как вы достигнете производительности, превышающей O (n), при увеличении изображения (например, при вставке копий строк). Мне кажется, что лучшее, что может сделать FreeImage, - это внутренне малокое новое хранилище, достаточное для увеличения изображения, а затем копирования данных изображения из источника в новое изображение. Казалось бы, это O (n).
Использование новой структуры данных (такой как B-дерево) потребует некоторых усилий, но даст вам лучшие характеристики времени вставки (O (log (n))). Однако компромисс для ускорения - увеличенное пространство хранения. Вы будете хранить каждый пиксель в большем количестве места.
Поскольку GDI + кажется закрытым исходным кодом, я не уверен, как он реализует растровые изображения, но, учитывая характеристики производительности, он кажется хуже, чем FreeImage.