如何解决图像因为拉伸所造成的马赛克现象。就如低分辨率的图片放到高分辨率下全屏时,图像效果很差,明显得颗粒状。有什么办法可以让其看得清晰一些,颗粒的边界模糊一些?

解决方案 »

  1.   

    tO:hnhb(死鸟)
    矢量图就不叫那个什么什么的“图像”了。
      

  2.   

    如 xiaoxiao197821(你的笑对我很重要) 所说还是用此笨方法吧,不然说不定图像效果都不是很好。
      

  3.   

    xiaoxiao197821(你的笑对我很重要).不行,图像来自实时视频流。
      

  4.   

    对来自实时视频流的图像,没有好方法
    对静止图像可采用插值等方法,效果很好,网上有方面资料,自己查查
                  Web:http://www.dapha.net
                  Web:http://www.5ivb.net
                  BBS:http://www.dapha.net/bbs
    "最快的图像平滑缩放程序.zip"
      

  5.   

    拉伸时用下面的API函数StretchBlt,效果好一些:
    procedure ZoomBmp(imagen: TBitmap; dWidth, dHeight: Integer; var des: TBitmap);
    var
      ori: TBitmap;
      dispositivo_o, dispositivo_d: HDC;
      pepito: HBitmap;
    begin
      ori := Tbitmap.Create;
      des := TBItmap.Create;
      ori.handle := imagen.handle;
      des.width := dWidth;
      des.height := dHeight;
      dispositivo_o := CreateCompatibleDC(0);
      dispositivo_d := CreateCompatibleDC(0);
      SelectObject(dispositivo_o, ori.handle);
      pepito := SelectObject(dispositivo_d, des.handle);
      SetStretchBltMode(dispositivo_d,  STRETCH_HALFTONE);
      StretchBlt(dispositivo_d, 0, 0, dWidth, dHeight, dispositivo_o, 0, 0, ori.width, ori.height, SRCCOPY);
      SelectObject(dispositivo_d, pepito);
      ori.Free;
      DeleteObject(pepito);
     DeleteDC(dispositivo_o);
     DeleteDC(dispositivo_d);
    end;如果觉得效果还是不行,就用一下AntiAlias算法,它可以达到边界模糊:
    uses
      math;procedure AntiAliasRect(clip: tbitmap; XOrigin, YOrigin,
      XFinal, YFinal: Integer);
    var
      Memo, x, y: Integer; (* Composantes primaires des points environnants *)
      p0, p1, p2: pbytearray;begin
      if XFinal < XOrigin then
      begin
        Memo := XOrigin;
        XOrigin := XFinal;
        XFinal := Memo;
      end; (* Inversion des valeurs   *)
      if YFinal < YOrigin then
      begin
        Memo := YOrigin;
        YOrigin := YFinal;
        YFinal := Memo;
      end; (* si diff俽ence n俫ative*)
      XOrigin := max(1, XOrigin);
      YOrigin := max(1, YOrigin);
      XFinal := min(clip.width - 2, XFinal);
      YFinal := min(clip.height - 2, YFinal);
      clip.PixelFormat := pf24bit;
      for y := YOrigin to YFinal do
      begin
        p0 := clip.ScanLine[y - 1];
        p1 := clip.scanline[y];
        p2 := clip.ScanLine[y + 1];
        for x := XOrigin to XFinal do
        begin
          p1[x * 3] := (p0[x * 3] + p2[x * 3] + p1[(x - 1) * 3] + p1[(x + 1) * 3])
          div 4;
          p1[x * 3 + 1] := (p0[x * 3 + 1] + p2[x * 3 + 1] + p1[(x - 1) * 3 + 1] +
            p1[(x + 1) * 3 + 1]) div 4;
          p1[x * 3 + 2] := (p0[x * 3 + 2] + p2[x * 3 + 2] + p1[(x - 1) * 3 + 2] +
            p1[(x + 1) * 3 + 2]) div 4;
        end;
      end;
    end;
      

  6.   

    建议楼主找个PicShow3.X看看,图像显示控件,是delphi源码。
      

  7.   

    http://www.delphiarea.com/products/#TPicShow_TDBPicShow
      

  8.   

    回复人: YFLK(远方来客) ( ) 信誉:100  2004-01-11 10:24:00  得分:0 
     
     
      对来自实时视频流的图像,没有好方法
    对静止图像可采用插值等方法,效果很好,网上有方面资料,自己查查
                  Web:http://www.dapha.net
                  Web:http://www.5ivb.net
                  BBS:http://www.dapha.net/bbs
    "最快的图像平滑缩放程序.zip"===============================================================哈哈
    那是我写的