1、用Win32 API:
SetWorldTransform是API带的,可以旋转,缩放
2、用OpenGL
用OpengGL也可以通过移动视点来实现,glTranslate3f
3、自己做,就是什么九点采样、中值滤波之类的算法,你得好好看看计算机图形学

解决方案 »

  1.   

    我需要算法,另外,do you know DirectX中有没有这类的API?
      

  2.   

    我自己设计了个算法,实现插值缩放,原理如下:
    2 --> 3
    000 111
    -> 000 000 000 111 111 111
    -> (000+000)/2 (000+111)/2 (111+111)/2
    想法很简单很笨,当然效果也是最理想,但是不现实的:
    我实现了该算法,一幅640*480的24位真彩图放大成800*600要用28s(在我的duron 700)!!
    小图还可以接受,200*200图用1s左右。
    我所写的算法几乎已经是在不内嵌asm的情况下非常优化的了(在循环中除了最后的除法外全部用加法和指针运算)
    因此好的算法要胜过任何优化,“人脑是最好的优化器”,car如是说。
    我已经想到一个更好的算法了,呵呵~~。
      

  3.   

    写一个给你吧!
      这个是在16位色下工作的。
      /*src pointer to memory containe bitmap data  */
      /*src_w width of src line                     */
      /*dest_w width of dest line                   */  void* ScaleLine(void* src,int src_w,int dest_w)/*scale one line of pixel */
      {
            int   scalerate=(100*dest_w)/src_w;
            int   ds=0;
            char* dest;
            char* srce=src;
            dest=new char[dest_w<<1];
            for(int i=0;i<dest_w;i++)
            {
                    dest[i<<1]=srce[ds/100<<1];
                    dest[(i<<1)+1]=srce[(ds/100<<1)+1];
                    ds+=scalerate;
            }
            return dest;
      }
      /* scale a given sets of line  */
      /* src_l  lines of src         */
      /* dest_l lines of dest        */
      void **Scale(void** src,int* src_w,int* dest_w,int src_l,int dest_l)
      {
            void** dest=new (void*)[dest_l];
            int ds=0;
            int scalerate=(100*dest_l)/src_l;
            for(int i=0;i<dest_l;i++)
            {
                    dest[i]=ScaleLine(src[ds/100],src_w[ds/100],dest_w[ds/100]);
                    ds+=scalerate;
            }
            return dest;
      }
    不带过滤的,没有优化
      

  4.   

    那天用了一下acdsee3, 发现photo enhancer里可以选择的缩放算法有七种之多,不知我自己想出的那个叫什么名字:(
    跟你说一下思路:
    目标图上每个点都用原图上的相邻四点运算得出。
    简单起见,先说一维的情况(也不考虑颜色,每个字节一个像素):
    下面是对一行进行放缩的伪代码。
    int i = 0, si = 0;  // i: 目标图增量,si: 原图增量 
    int inc = 0; // inc: 比例系数
    for (i = 0; i < dw; i++) { // dw是目标图宽
        pDest[i] = pSrc[si]*(1-inc/(float)dw)+pSrc[si+1]*(inc/(float)dw); 
        inc += sw; // sw是原图宽
        while (inc >= dw) {
            inc -= dw;
            si++;
        }
    }算法我已经实现,640*480 -> 800*600 < 0.5s(包括图片载入时间:)