问题如下:
    有三个图片控件,image1,image2,image3,image4 大小为image1(200,200),image2(200,200),image3(1000,1000),image4(5,5)    我想把image1与image2的图片,结何实现透明,并且把每一点放大5倍,放到image3上.我的思路是:    对image1,image2每一点读出来,并且扩大该点为5倍大小,即为(5,5)加以混合运算实现半稳明,然后把该点(5*5)大小的图片拷贝到image3上,请问我的思路是否正确呢?
    我用上面这种思路编写了一段程序,程序结构如下:
    for x:=0 to 199 do begin
        for y:=0 t0 199 do begin
           (1) 我根据y的值为透明值,
           (2) 现在我(x,y)点读出,使image4的色素为(x,y)点的色素,而且要使image4为透明.透明值为 y ,
            { 上面我为了实现 image4 透明,又加了两个for循环
             for xx:=0 to 4 do begin
                for yy:=0 to 4 begin
                end;
             end;
            }
           (3) 现在就把image4的图片拷贝到image3上去.
    end;
    end;
    
    小弟把整个程序写完,但加载速度有点慢.所以来请教高手,实现上面的功能思路上有没有更好的解决方法呢? 高手们可以说一说你们更好的想法呢? 从算法上能否在修改修改呢?

解决方案 »

  1.   

    //要快速处理位图,不能用Canvas的方法~~
    //通常使用TBitmap.ScanLine[]属性~~
    //参考如下代码~~function BitmapGridPoint(mBitmap: TBitmap; mOffset: Boolean;
      mTransparentColor: TColor): Boolean;
    var
      X, Y: Integer;
      vRGBTriple: PRGBTriple;
      vTransparent: TRGBTriple;
      vOldPixelFormat: TPixelFormat;
    begin
      Result := False;
      if not Assigned(mBitmap) then Exit;
      vOldPixelFormat := mBitmap.PixelFormat;
      try
        mTransparentColor := ColorToRGB(mTransparentColor);
        vTransparent.rgbtBlue := GetBValue(mTransparentColor);
        vTransparent.rgbtRed := GetRValue(mTransparentColor);
        vTransparent.rgbtGreen := GetGValue(mTransparentColor);    mBitmap.PixelFormat := pf24bit;
        for Y := 0 to mBitmap.Height - 1 do begin
          vRGBTriple := mBitmap.ScanLine[Y];
          for X := 0 to mBitmap.Width - 1 do begin
            if Odd(X) xor Odd(Y) xor mOffset then
              vRGBTriple^ := vTransparent;
            Inc(vRGBTriple);
          end;
        end;
      finally
        mBitmap.PixelFormat := vOldPixelFormat;
      end;
      Result := True;
    end; { BitmapGridPoint }
      

  2.   

    image3(1000,1000),/////////可以考虑开2个线程来处理 图片的放大操作,因为图片很大,即使是ScanLine[]。操作也不快。同时操作
    节省的时间很可观了。放大操作没什么好说的。zswang(伴水清清)(专家门诊清洁工) 给出了函数使用方法。你要放大5倍。注意一下是扫一行源位图就要连续扫5 行目标位图。读一个源像素,就要写5个目标像素。循环需要注意点。