Масштабирование изображения

Тема в разделе "LANGS.C", создана пользователем WatCheR, 22 ноя 2008.

  1. WatCheR

    WatCheR New Member

    Публикаций:
    0
    Регистрация:
    8 июн 2005
    Сообщения:
    5
    Адрес:
    Russia, Ufa
    Нужно создать Preview для картинки и отобразить её в некоторой ограниченной области, ну или уменшить рисунок, ограничив его по вертикали и горизонтали сохранив пропоорции... Собственно нужен алгоритм расчёта размера сторон для масштабирования в определённый четырёхугольник =)

    З.Ы. В школе математику и геометрию не учил, помидоры не кидать

    Заранее благодарен за любую помощь
     
  2. cppasm

    cppasm New Member

    Публикаций:
    0
    Регистрация:
    18 июл 2006
    Сообщения:
    923
    StretchDIBits() ??
     
  3. censored

    censored New Member

    Публикаций:
    0
    Регистрация:
    5 июл 2005
    Сообщения:
    1.615
    Адрес:
    деревня "Анонимные Прокси"
    В школе с математикой дружил, поэтому делал когда то для PowerPC-проекта лин. интерполяцию:
    Код (Text):
    1. static inline unsigned short getColor(unsigned short c1, unsigned short c2)
    2. {
    3.     int r1=c1&CSprite::fmt.rs, g1=c1&CSprite::fmt.gs, b1=c1&CSprite::fmt.bs;
    4.     int r2=c2&CSprite::fmt.rs, g2=c2&CSprite::fmt.gs, b2=c2&CSprite::fmt.bs;
    5.  
    6.     //int r1=c1&0xf800, g1=c1&0x7e0, b1=c1&0x1f;
    7.     //int r2=c2&0xf800, g2=c2&0x7e0, b2=c2&0x1f;
    8.  
    9.     int r = (r1+r2)>>1;
    10.     int g = (g1+g2)>>1;
    11.     int b = (b1+b2)>>1;
    12.     return (unsigned short)(r|g|b);
    13. }
    14.  
    15. static inline
    16. void DrawLinear(CSprite *pDst, int xDst, int yDst, int xsDst, int ysDst, CSprite *pSrc, int xSrc, int ySrc)
    17. {
    18.     GASSERT(xDst+xsDst<=pDst->x && yDst+ysDst<=pDst->y);
    19.  
    20.     pDst->Lock();
    21.     int xsSrc=(xsDst>>1); int ysSrc=(ysDst>>1);
    22.     for (int y1=ySrc, y2=yDst; y1<ysSrc; y1++, y2+=2) {
    23.         unsigned short *src = (unsigned short *)&pSrc->bufColor[y1*pSrc->bpl];
    24.         unsigned short *dst = (unsigned short *)&pDst->bufColor[y2*pDst->bpl];
    25.         for (int x1=xSrc, x2=xDst; x1<xsSrc; x1++, x2+=2) {
    26.             unsigned short
    27.                 c00 = src[x1], c01 = src[x1+1],
    28.                 c10 = src[x1+(pSrc->bpl>>1)], c11 = src[x1+(pSrc->bpl>>1)+1];
    29.             dst[x2] = c00;
    30. #ifdef NOINTERPOLATION
    31.             dst[x2+1] = c00;
    32.             dst[x2+pDst->y] = c00;
    33.             dst[x2+1+pDst->y] = c00;
    34. #else
    35.             dst[x2+1] = getColor(c00, c01);
    36.             dst[x2+pDst->y] = getColor(c00, c10);
    37.             dst[x2+1+pDst->y] = getColor(c00, c11);
    38. #endif // NOINTERPOLATION
    39.         }
    40.     }
    41.     pDst->Unlock();
    42. }
    маленькая картинка становилась большой :) в обратную сторону тоже самое.