Как изменить масштаб изображения с C / C ++ в Windows? - PullRequest
0 голосов
/ 13 октября 2010

Какое самое короткое решение в c / c ++?

Ответы [ 4 ]

2 голосов
/ 13 октября 2010

Вы не дали слишком много информации, поэтому я пойду с StretchBlt

Например, см. Масштабирование изображения .

1 голос
/ 13 октября 2010

Я не буду показывать вам демонстрацию, но попробуйте сделать следующее:

  • создать целевое растровое изображение нужного размера
  • выбрать это растровое изображение в контексте устройства
  • Исходное растровое изображение StretchBlt для ранее упомянутого контекста устройства
  • отмена выбора растрового изображения из контекста устройства

Для этого рецепта не требуется никакой библиотеки, кроме GDI, который уже присутствует в Windows.И если вы планируете что-то нарисовать в c ++, вам все равно следует ознакомиться с этой библиотекой.

Смотрите здесь: http://www.ucancode.net/Free-VC-Draw-Print-gdi-example-tutorial/GDI-Object-VC-MFC-Tutorial.htm

или здесь: http://www.olivierlanglois.net/clover.html

, еслиВы не планируете использовать MFC для этой задачи.

0 голосов
/ 13 октября 2010

Какие библиотеки вы используете? Как вы представляете изображения? Большинство библиотек изображений уже должны это делать, например, Qt имеет QPixmap с scaled (), а GDI имеет StretchBlt.

Или вы можете кодировать его самостоятельно с помощью бикубической интерполяции .

0 голосов
/ 13 октября 2010

Один из самых простых алгоритмов масштабирования - это ближайший сосед.Предположим, вы масштабируете изображение из массива размером x1 y1 в другой размер x2 y2.Идея состоит в том, чтобы найти ближайшее целочисленное смещение в исходном массиве к каждой позиции целевого массива.Так что ваш алгоритм масштабирования заканчивается примерно так:

const int x1 = 512;
const int y1 = 512;
const int x2 = 64;
const int y2 = 64;
unsigned char orig[x1*y1]; /* Original byte array */
unsigned char target[x2*y2] /* Target byte array */
for(int i=0;i<x2;i++)
{
    for(int j=0;j<y2;j++)
    {
       xoff = (i*x2)/x1;
       yoff = (j*y2)/y1;
       target[i+j*x2] = orig[xoff+yoff*x1]
    }
}

Это даст блочное изображение с измененным размером.Для лучших результатов вы можете использовать усредненные или любые другие более интересные интерполяторы на основе полиномов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...