Я нашел wxWidgets реализацию довольно простой для изменения как требуется. Это - весь C++ так никакие проблемы с мобильностью там. Единственная разница - то, что их реализация работает с неподписанными массивами символов (который я нахожу, чтобы быть самым легким способом иметь дело с изображениями во всяком случае) с порядком байтов RGB и альфа-компонента в отдельном массиве.
, Если Вы обращаетесь к "src/common/image.cpp" файлу в wxWidgets исходном дереве, существует функция вниз-сэмплера, которая использует метод выборки поля "wxImage:: ResampleBox" и функция-счетчика, вызванная "wxImage:: ResampleBicubic".
Довольно простой и достойный алгоритм для передискретизации изображений Бикубическая интерполяция , одна только Википедия имеет всю информацию, необходимо было реализовать это.
Действительно ли возможно, что OpenGL делает масштабирование в векторном домене? Если так, нет никакого способа, которым любое основанное на пикселе масштабирование будет около него по качеству. Это - большое преимущество векторных изображений.
bicubic алгоритм может быть настроен для резкости по сравнению с артефактами - я пытаюсь найти ссылку, я отредактирую его в том, когда я сделаю.
Редактирование: Это была работа Mitchell-Netravali, о которой я думал, на который ссылаются в нижней части этой ссылки:
http://www.cg.tuwien.ac.at/~theussl/DA/node11.html
Вы могли бы также изучить Lanczos, передискретизирующий как альтернатива bicubic.
Теперь, когда я вижу Ваше исходное изображение, я думаю, что OpenGL использует ближайший соседний алгоритм. Мало того, что это - самый простой способ изменить размер, но и это является также самым быстрым. Единственный недостаток - то, что это выглядит очень грубым, если существует какая-либо деталь в Вашем исходном изображении.
идея состоит в том, чтобы взять равномерно расположенные с интервалами образцы от Вашего исходного изображения; в Вашем случае, 55 из 256, или один из каждых 4.6545. Только вокруг числа, чтобы заставить пиксель выбирать.
Статьи CodeProject обсуждающий и совместно использующий исходный код для масштабирующиеся изображения:
Попытайтесь использовать Adobe Generic Image Library ( http://opensource.adobe.com/wiki/display/gil/Downloads ), если Вы хотите что-то готовое и не только алгоритм.
<час>Извлечение из: http://www.catenary.com/howto/enlarge.html#c
Увеличивает или Уменьшает - Исходный код C Требует Библиотеки Обработки изображений Victor для 32-разрядного Windows v 5.3 или выше.
int enlarge_or_reduce(imgdes *image1)
{
imgdes timage;
int dx, dy, rcode, pct = 83; // 83% percent of original size
// Allocate space for the new image
dx = (int)(((long)(image1->endx - image1->stx + 1)) * pct / 100);
dy = (int)(((long)(image1->endy - image1->sty + 1)) * pct / 100);
if((rcode = allocimage(&timage, dx, dy,
image1->bmh->biBitCount)) == NO_ERROR) {
// Resize Image into timage
if((rcode = resizeex(image1, &timage, 1)) == NO_ERROR) {
// Success, free source image
freeimage(image1);
// Assign timage to image1
copyimgdes(&timage, image1);
}
else // Error in resizing image, release timage memory
freeimage(&timage);
}
return(rcode);
}
Этот пример изменяет размер области изображения и заменяет исходное изображение новым изображением.
Intel имеет библиотеки IPP, которые предоставляют высокоскоростные алгоритмы интерполяции, оптимизированные для процессоров семейства Intel. Это очень хорошо, но это не свободно все же. Смотрите на следующую ссылку:
Это походит на то, что Вы действительно испытываете затруднения при понимании, дискретное-> непрерывный-> дискретный поток, вовлеченный в надлежащую передискретизацию изображения. Хорошим техническим отчетом, который мог бы помочь дать Вам понимание этого, что Вам нужно, является Alvy Ray Smith , Пиксель А Не Немного Квадрата .
Универсальная статья от нашего любимого хоста: Лучшее Изображение, Изменяющее размер , обсуждая относительные качества различных алгоритмов (и это связывается с другой статьей CodeProject).
Смотрите на ImageMagick, который делает все виды перемасштабирования фильтров.
Как развитие, Jeremy Rudd отправил эта статья выше. Это реализует фильтрованный два изменения размеров передачи. Источники являются C#, но выглядит достаточно ясным, что я могу портировать его, чтобы дать ему попытку. Я вчера нашел очень похожий код C, который было намного более трудно понять (очень плохие имена переменной). Я получил его к виду работы, но это было очень медленно и не приводило к хорошим результатам, которые привели меня полагать, что в моей адаптации была ошибка. У меня может быть лучшая удача при записи этого с нуля с этим как ссылка, которую я попробую.
, Но рассматривающий, как две работы алгоритма передачи интересно, нет ли более быстрого способа сделать его, возможно, даже в одной передаче?