delphi2007 教程

delphi2007 教程

首页 新随笔 联系 聚合 管理
  1013 Posts :: 0 Stories :: 28 Comments :: 0 Trackbacks
如何做到BMP图象缩放时平滑过渡? Delphi / Windows SDK/API
http://www.delphi2007.net/DelphiMultimedia/html/delphi_20060926170109289.html
类似CAD、GOOGLE   EARTH的效果,哪个高手给说道说道

1   CAD不是BMP图片,是一种矢量图  
  2   GoogleEarth是用了多级图片,不同的缩放级别显示不同的图片

GoogleEarth在同一级别缩放也是相当平滑的,不知道怎么实现的,高手请继续说

有一些平滑算法,可以让图片,看起来有些平滑...

缩放使用插值算法,比如双线性插值,样条插值等等

同意楼上,选取好的插值算法。

有   开源项目..   去   sf查查   看

//图像缩放过程,带插值运算(线性插值法)  
  //参数:矩形区域,源图像  
  //注意:此代码只支持24或32位色的情况(对于15或16位色需要按位拆开—因为不拆开的话  
  //             会在计算中出现不期望的进位或借位,导致图像颜色混乱—处理较麻烦;对于8位  
  //             及8位以下索引色需要查调色板,并且需要重索引,也很麻烦,所以都不支持;但  
  //             8位灰度图像可以支持)。另外代码中加入一些在图像边缘时防止访问越界的代码。  
  procedure   StretchLinear(Dest,   Src:   TBitmap);   //   only   for   24bit   bitmap  
  var  
      sw,   sh,   dw,   dh,   B,   N,   x,   y,   i,   j,   k,   nPixelSize:   DWord;  
      pLinePrev,   pLineNext,   pDest,   pA,   pB,   pC,   pD:   PByte;  
  begin  
      sw   :=   Src.Width   -1;  
      sh   :=   Src.Height   -1;  
      dw   :=   Dest.Width   -1;  
      dh   :=   Dest.Height   -1;  
      nPixelSize   :=   3;               //GetPixelSize(Dest.PixelFormat)  
      for   i   :=   0   to   dh   do   begin  
          pDest   :=   Dest.ScanLine[i];  
          y   :=   i   *   sh   div   dh;  
          N   :=   dh   -   i   *   sh   mod   dh;  
          pLinePrev   :=   Src.ScanLine[y];  
          Inc(y);  
          if   N   =   dh   then   begin  
              pLineNext   :=   pLinePrev;  
          end   else   begin  
              pLineNext   :=   Src.ScanLine[y];  
          end;  
          for   j   :=   0   to   dw   do   begin  
              x   :=   j   *   sw   div   dw   *   nPixelSize;  
              B   :=   dw   -   j   *   sw   mod   dw;  
              pA   :=   pLinePrev;  
              Inc(pA,   x);  
              pB   :=   pA;  
              Inc(pB,   nPixelSize);  
              pC   :=   pLineNext;  
              Inc(pC,   x);  
              pD   :=   pC;  
              Inc(pD,   nPixelSize);  
              if   B   =   dw   then   begin  
                  pB   :=   pA;  
                  pD   :=   pC;  
              end;  
              for   k   :=   0   to   nPixelSize   -1   do   begin  
                  pDest^   :=   Byte(DWord(   (B   *   N   *   DWord(pA^   -   pB^   -   pC^   +   pD^)   +   dw   *   N   *   pB^  
                                                              +   dh   *   B   *   pC^   +   (dw   *   dh   -   dh   *   B   -   dw   *   N)*   pD^  
                                                              +   dw   *   dh   div   2)   div   (dw   *   dh)   ));  
                  Inc(pDest);  
                  Inc(pA);  
                  Inc(pB);  
                  Inc(pC);  
                  Inc(pD);  
              end;  
          end;  
      end;  
  end;  
 

posted on 2009-03-13 10:29 delphi2007 阅读(422) 评论(0)  编辑 收藏 引用
只有注册用户登录后才能发表评论。