各位大哥100分求你们了!把题目看清楚可以不?
 
求两个函数 ——放大缩小 图片本身大小!!!
1)看清楚了 不是要变 IMAGE 大小 ,
2)要变的是 IMAGE 中的图片大小,
3)也就是 图片 宽高上的 象素点 按比例 自动
放大缩小可以不?
(就象photoshop中那样 处理 图片的
方式,可别说 大哥们 这都忘记了吧!)
function 放大(scr:TBitMap):TBitMap;
function 缩小(scr:TBitMap):TBitMap; 

解决方案 »

  1.   

    哦,可以哦。呵,记得有个stretchdraw函数,可以把指定区的图像,画成你指定的大小,可以使图像真正的缩放!你可以先自己定义一个BMP的变量,然后你把IMAGE的图画到BMP里,然后再用图像传递方法给传回来,具体怎么做,自己想想吧。我没时间写代码给你的。
      

  2.   

    StretchDraw(constRect:TRect;Graphic:TGraphic)。它可在画布指定的矩形区域内完整地“画”出一个图像,如果源图象区域与目的区域尺寸不一致,会自动Stretch(拉伸),能有效的避免色彩失真。但此函数只能“画”出整个图像,如果只需“画”出一部分图像则应配合CopyRect()使用,先用StretchDraw()使整幅位图“变形”输出到一个画布,然后再用CopyRect()函数将所需部分“画出”。 
      

  3.   

    StretchDraw可以粗略的改变图象的大小。
    具体的方法是:
    先建立一个备份Bitmap,然后将Image的图像数据复制到备份Bitmap上。
    接下来改变源图像大小(注意要改TImage.Picture的大小,而不是Image的大小)。
    最后把备份的图像StretchDraw到源图像上。
      

  4.   

    Procedure SmoothResize(Var Src, Dst: TBitmap);
    Var
      x, y, xP, yP,
        yP2, xP2: Integer;
      Read, Read2: PByteArray;
      t, t3, t13, z, z2, iz2: Integer;
      pc: PBytearray;
      w1, w2, w3, w4: Integer;
      Col1r, col1g, col1b, Col2r, col2g, col2b: byte;
    Begin
      xP2 := ((src.Width - 1) Shl 15) Div Dst.Width;
      yP2 := ((src.Height - 1) Shl 15) Div Dst.Height;
      yP := 0;
      For y := 0 To Dst.Height - 1 Do
        Begin
          xP := 0;
          Read := src.ScanLine[yP Shr 15];
          If yP Shr 16 < src.Height - 1 Then
            Read2 := src.ScanLine[yP Shr 15 + 1]
          Else
            Read2 := src.ScanLine[yP Shr 15];
          pc := Dst.scanline[y];
          z2 := yP And $7FFF;
          iz2 := $8000 - z2;
          For x := 0 To Dst.Width - 1 Do
            Begin
              t := xP Shr 15;
              t3 := t * 3;
              t13 := t3 + 3;
              Col1r := Read[t3];
              Col1g := Read[t3 + 1];
              Col1b := Read[t3 + 2];
              Col2r := Read2[t3];
              Col2g := Read2[t3 + 1];
              Col2b := Read2[t3 + 2];
              z := xP And $7FFF;
              w2 := (z * iz2) Shr 15;
              w1 := iz2 - w2;
              w4 := (z * z2) Shr 15;
              w3 := z2 - w4;
              pc[x * 3 + 2] :=
                (Col1b * w1 + Read[t13 + 2] * w2 +
                Col2b * w3 + Read2[t13 + 2] * w4) Shr 15;
              pc[x * 3 + 1] :=
                (Col1g * w1 + Read[t13 + 1] * w2 +
                Col2g * w3 + Read2[t13 + 1] * w4) Shr 15;
              // (t+1)*3  is now t13
              pc[x * 3] :=
                (Col1r * w1 + Read2[t13] * w2 +
                Col2r * w3 + Read2[t13] * w4) Shr 15;
              Inc(xP, xP2);
            End;
          Inc(yP, yP2);
        End;
    End;
      

  5.   

    StretchDraw(constRect:TRect;Graphic:TGraphic)。它可在画布指定的矩形区域内完整地“画”出一个图像,如果源图象区域与目的区域尺寸不一致,会自动Stretch(拉伸),能有效的避免色彩失真。但此函数只能“画”出整个图像,如果只需“画”出一部分图像则应配合CopyRect()使用,先用StretchDraw()使整幅位图“变形”输出到一个画布,然后再用CopyRect()函数将所需部分“画出”。 给你个例子
    添加两个image控件image1(放小一点),image2(放大一点;
    给image1导入picture;image1就显示了一个小图片;
    image2.canvas.StretchDraw(image2.cliprect,image1.pictuer.bitmap);
    这样就会把image1里的图片转到image2中显示,而且有效的避免了色彩失真