当前位置:首页 » 多媒体相关

图像旋转和镜像问题


我在处理图像旋转和镜像问题的时候,用pixel的赋值进行操作,发现效率很差,因此改用其它的方法,例如:scanline、bitblt等也不是很好。  
   
  不过再用stretchdraw的时候速度挺快,但是不管坐标如何定义,总是有一白边,代码如下:  
  //mirhorizontal:  
  var  
  bit,bitcurrent:tbitmap;  
  rctdraw:trect;  
  begin  
  bitcurrent.width:=bit.width   ;  
  bitcurrent.height:=   bit.height   ;  
  rctdraw.:=0;  
  rctdraw.left:=bit.width;//改成bit.width-1也不行  
  rctdraw.bottom   :=bit.height;//改成bit.height-1也不行  
  rctdraw.right   :=0;  
  bitcurrent.canvas.stretchdraw(rctdraw,bit);  
  end;  
   
  希望各位图像旋转和镜像问题给于好的建议和方法,上面的代码能指出错误的原因。  
 

推荐阅读

  • 百度当选2005中国品牌建设年度十大案例 [详细内容]
  • Bjarne:可以在构造函数中调用虚拟函数吗? [详细内容]
  • 浅谈X799死机问题 [详细内容]
  • 推动网络游戏发展 新加坡一青年获准缓服兵役 [详细内容]
  • Bjarne:为什么不能有虚拟构造函数? [详细内容]
  • ES1008 08版不足与使用技巧 [详细内容]
  • 卡比尔病毒重现江湖 芬兰大批量手机被感染 [详细内容]
  • 网友回答:
    网友:dwgz

    rctdraw.left:=bit.width   +   1;试试  
      这种例子很多的到处找找一大堆  
     

    网友:cnssk

    //镜像(水平翻转)  
      procedure   mirror(jpg:tjpegimage);  
      var  
            x,y                                   :   integer;  
            srcrect,dstrect           :   trect;  
            bitmap1,bitmap2:tbitmap;  
      begin  
      //     try  
              try  
                  bitmap1:=tbitmap.create;  
                  bitmap1.pixelformat:=pf24bit;  
                  bitmap1.width:=jpg.width;  
                  bitmap1.height:=jpg.height;  
                  bitmap1.assign(jpg);  
                  x   :=   bitmap1.width;  
                  y   :=   bitmap1.height;  
                  srcrect   :=   rect(0,0,x,y);  
                  dstrect   :=   rect(x,0,0,y);  
                  bitmap2   :=   tbitmap.create;  
                  bitmap2.pixelformat:=pf24bit;  
                  bitmap2.width   :=   x;  
                  bitmap2.height   :=   y;  
                  bitmap2.canvas.copyrect(dstrect,bitmap1.canvas,srcrect);  
                  jpg.assign(bitmap2);  
              finally;  
                  bitmap1.free;  
                  bitmap2.free;  
              end;  
      end;  
     

    网友:cnssk

    function   rotatescanline90(const   angle:     integer;  
                                                          const   bitmap:     tbitmap):tbitmap;  
            function   simplecopy:     tbitmap;       //0  
            var   i           :     integer;  
                    j           :     integer;  
                    rowin   :     prgbarray;  
                    rowout:     prgbarray;  
            begin  
                  result   :=   tbitmap.create;  
                  result.width     :=   bitmap.width;  
                  result.height   :=   bitmap.height;  
                  result.pixelformat   :=   bitmap.pixelformat;         //  
                  for   j   :=   0   to   bitmap.height   -   1   do   begin  
                        rowin     :=   bitmap.scanline[j];  
                        rowout   :=   result.scanline[j];  
                        for   i   :=   0   to   bitmap.width   -   1   do   begin  
                              with   rowout[i]   do   begin  
                                    rgbtred       :=   rowin[i].rgbtred;  
                                    rgbtgreen   :=   rowin[i].rgbtgreen;  
                                    rgbtblue     :=   rowin[i].rgbtblue;  
                              end;  
                        end;  
                  end;  
            end   {简单拷贝};  
       
            function   rotate90degreescounterclockwise:     tbitmap;  
                  var   i           :     integer;  
                          j           :     integer;  
                          rowin   :     prgbarray;  
            begin  
                  result   :=   tbitmap.create;  
                  result.width     :=   bitmap.height;  
                  result.height   :=   bitmap.width;  
                  result.pixelformat   :=   bitmap.pixelformat;  
                  for   j   :=   0   to   bitmap.height   -   1   do   begin  
                        rowin     :=   bitmap.scanline[j];  
                        for   i   :=   0   to   bitmap.width   -   1   do  
                          prgbarray(result.scanline[bitmap.width   -   i   -   1])[j]   :=   rowin[i]  
                  end  
              end;  
              function   rotate180degreescounterclockwise:     tbitmap;  
                  var   i           :     integer;  
                          j           :     integer;  
                          rowin   :     prgbarray;  
                          rowout:     prgbarray;  
              begin  
                    result   :=   tbitmap.create;  
                    result.width     :=   bitmap.width;  
                    result.height   :=   bitmap.height;  
                    result.pixelformat   :=   bitmap.pixelformat;         //   only   pf24bit   for   now  
                    for   j   :=   0   to   bitmap.height   -   1   do   begin  
                          rowin     :=   bitmap.scanline[j];  
                          rowout   :=   result.scanline[bitmap.height   -   j   -   1];  
                          for   i   :=   0   to   bitmap.width   -   1   do  
                                rowout[bitmap.width   -   i   -   1]   :=   rowin[i]  
                    end  
              end   {rotate180degreescounterclockwise};  
              function   rotate270degreescounterclockwise:     tbitmap;  
                  var   i         :     integer;  
                          j         :     integer;  
                          rowin:     prgbarray;  
              begin  
                    result   :=   tbitmap.create;  
                    result.width     :=   bitmap.height;  
                    result.height   :=   bitmap.width;  
                    result.pixelformat   :=   bitmap.pixelformat;         //   only   pf24bit   for   now  
                    for   j   :=   0   to   bitmap.height   -   1   do   begin  
                          rowin     :=   bitmap.scanline[j];  
                          for   i   :=   0   to   bitmap.width   -   1   do  
                                prgbarray(result.scanline[i])[bitmap.height   -   j   -   1]   :=   rowin[i]  
                    end;  
              end   {rotate270degreescounterclockwise};  
       
              begin     //主函数开始  
        {       if   bitmap.pixelformat   <>   pf24bit  
              then   raise   ebitmaperror.create(仅支持24位图像);  
              if   (angle   >=   0)   and   (angle   mod   90   <>   0)  
              then   raise   ebitmaperror.create(参数错误!);}  
              try  
                  case   (angle   div   90)   mod   4   of  
                        0:     result   :=   simplecopy;  
                        1:     result   :=   rotate90degreescounterclockwise;     //   anticlockwise   for   the   brits  
                        2:     result   :=   rotate180degreescounterclockwise;  
                        3:     result   :=   rotate270degreescounterclockwise  
                  else  
                        result   :=   nil         //   avoid   compiler   warning  
                  end;  
              except  
                  on   eoutofresources   do  
                      messagebox(application.handle,系统资源不足!,error,mb_ok+mb_iconerror);  
                  on   eoutofmemory   do  
                      messagebox(application.handle,内存溢出!,error,mb_ok+mb_iconerror);  
              else  
                  messagebox(application.handle,出现异常错误!,error,mb_ok+mb_iconerror);  
              end;  
     

    网友:cnssk

    根据我使用的情况,scanline是效率最高的,如果你认为不行的话,试试下面两个  
       
      //利用块拷贝方法将源图片进行翻转或颠倒  
      function   flipreversecopyrect(const   flip,   reverse:     boolean;  
                                                                const   bitmap:     tbitmap):     tbitmap;  
      var       bottom:     integer;  
                  left     :     integer;  
                  right   :     integer;  
                        :     integer;  
      begin  
            result   :=   tbitmap.create;  
            result.width               :=   bitmap.width;  
            result.height             :=   bitmap.height;  
            result.pixelformat   :=   bitmap.pixelformat;  
            if   flip   then   begin  
                          :=   bitmap.height-1;  
                  bottom   :=   -1  
                  end  
            else   begin  
                          :=   0;  
                  bottom   :=   bitmap.height  
            end;  
            if   reverse   then   begin  
                  left     :=   bitmap.width-1;  
                  right   :=   -1;  
                  end  
            else   begin  
                  left     :=   0;  
                  right   :=   bitmap.width;  
            end;  
            result.canvas.copyrect(rect(left,,   right,bottom),  
                                                          bitmap.canvas,  
                                                          rect(0,0,   bitmap.width,bitmap.height));  
      end   {flipreversecopyrect};  
       
       
      //利用申展方法将源图片进行翻转或颠倒  
      function   flipreversestretchblt(const   flip,   reverse:     boolean;  
                                                                    const   bitmap:     tbitmap):     tbitmap;  
      var       bottom:     integer;  
                  left     :     integer;  
                  right   :     integer;  
                        :     integer;  
      begin  
            result   :=   tbitmap.create;  
            result.width               :=   bitmap.width;  
            result.height             :=   bitmap.height;  
            result.pixelformat   :=   bitmap.pixelformat;  
            if   flip   then   begin  
                          :=   bitmap.height-1;  
                  bottom   :=   -1  
                  end  
            else   begin  
                          :=   0;  
                  bottom   :=   bitmap.height  
            end;  
            if   reverse   then   begin  
                  left     :=   bitmap.width-1;  
                  right   :=   -1;  
                  end  
            else   begin  
                  left     :=   0;  
                  right   :=   bitmap.width;  
            end;  
            stretchblt(result.canvas.handle,   left,   ,   right-left,   bottom-,  
                                  bitmap.canvas.handle,  
                                  0,0,   bitmap.width,   bitmap.height,   cmsrccopy);  
      end   {flipreversestretchblt};

    .

    讨论区

    Login