本人在写一个照片剪切程序,用image1显示直接从数码相机
取过来的Jpg格式的图片,再在image1上放了一个Shape做取
景框,把Shape套着的图片CopyRect到image2.
原本想用
Image2.Canvas.CopyRect(image2.ClientRect,image1.picture.bitmap.Canvas,image1Rect)
发现用CopyRect不能对Jpg的图像作操作,后来就用了一个取巧的方法。
Image2.Canvas.CopyRect(image2.ClientRect,Form1.Canvas,image1Rect)
这样照片是剪过来了,但是我发现这样过来的图片的质量明显比源图差,
简直是惨不忍暏。
我想问
1质量明显比源图差的原因是因为我用了Form1.Canvas的原因吗?
 如果不是,那又因为什么?
2如何直接剪切Jpg的图像而无损质量。

解决方案 »

  1.   

    procedure TForm1.Button1Click(Sender: TObject);
    var
      Bitmap: TBitmap;
      MyRect, MyOther: TRect;
    begin
      MyRect := Rect(10,10,100,100);
      MyOther := Rect(10,111,100, 201);
      Bitmap := TBitmap.Create;
      Bitmap.LoadFromFile('c:\n.bmp');
      Form1.Canvas.CopyRect(MyOther,Bitmap.Canvas,MyRect);  //为什么用Form1.Canvas.CopyRect
      image1.Canvas.CopyRect(MyOther,Bitmap.Canvas,MyRect);  //而用image1.Canvas.CopyRect不可以
      Bitmap.Free;
    end;
      

  2.   

    我也碰到过,好象是jpg的图画到bmp上可以,BMP的图画到JPG上不可以。质量明显比源图差的原因是因为我用了Form1.Canvas的原因吗?
    我想应该是。你用别的控件试试,好象有一个叫JPEGIMAGE的,我没试过,我改用BMP格式了。
      

  3.   

    我没做过,不过操作jpg图片要在头文件包含jpeg.hpp文件,
    至于质量差的原因是不是你用了进行了缩放了,当然质量要变差了,
    还有再copyrect之前加上一个api函数 
    SetStretchBltMode(Form1.Canvas->Handle,COLORONCOLOR);
    它会对你缩放的图片质量有所改善的.
      

  4.   

    我昨天也遇到同样问题,不过现在已解决,方法如下:
    定义一个临时Tbitmap,对它进行操作。procedure TForm1.Button1Click(Sender: TObject);
    var
    //  jpg:TJPEGImage;
      tmpBitmap:TBitmap;
      rt:TRect;
    begin
     //  jpg:=TJPEGImage.Create ;
      // jpg.Assign(Image1.Picture.Graphic);
        SetRect(rt,0,0 ,Image1.BoundsRect.Right -Image1.BoundsRect.Left ,
                       Image1.BoundsRect.Bottom - Image1.BoundsRect.Top );
       TmpBitmap:=TBitmap.Create ;
       TmpBitmap.Assign(Image1.Picture.Graphic);
       Image2.Height :=rt.Bottom  ;
       Image2.Width :=rt.Right ;
       Image2.Canvas.CopyRect(rt ,TmpBitmap.Canvas,rt);
       Image2.Repaint;
    end;