我想在Image1上截取一部分到Image2上。
结果出错:Can only Modify an image if it contains a bitmap

解决方案 »

  1.   

    提供一段代码给你参考:procedure TFrmDesktop.FixSize(const vFileName: String);
    var
      vBitmap3: TBitmap;
      vImage: TImage;
    begin
      try
        vImage := TImage.Create(self);
        vImage.Visible := False;
        vImage.AutoSize := true;
        vBitmap3 := TBitmap.Create;
        if CompareText(vExt, 'Bmp') = 0 then vImage.Picture.LoadFromFile(OpenDialog1.FileName);
        if CompareText(vExt, 'Jpg') = 0 then vImage.Picture.LoadFromFile(vFileName);
        if vImage.Picture.Bitmap.Height / vImage.Picture.Bitmap.Width > 0.75 then
        begin
          if vImage.Picture.Bitmap.Height >= ScreenY then
          begin
            vImage.Canvas.StretchDraw(Rect(0,0,round(vImage.Picture.Bitmap.Width * ScreenY/vImage.Picture.Bitmap.Height),ScreenY),vImage.Picture.Bitmap);
            vImage.Center := True;
            vBitmap3.Width := round(vImage.Picture.Bitmap.Width * ScreenY/vImage.Picture.Bitmap.Height);
            vBitmap3.Height := ScreenY;
            vBitmap3.Canvas.CopyRect(Rect(0,0,vBitmap3.Width,vBitmap3.Height), vImage.Canvas, Rect(0,0,round(vImage.Picture.Bitmap.Width * ScreenY/vImage.Picture.Bitmap.Height),ScreenY));
    Image2.Canvas, Rect(0,0,Image2.Width,Image2.Height));
          end
          else
            vImage.Picture.Bitmap.SaveToFile(vFileName);
        end
        else if vImage.Picture.Bitmap.Height / vImage.Picture.Bitmap.Width < 0.75 then
        begin
          if vImage.Picture.Bitmap.Width >= ScreenX then
          begin
            vImage.Canvas.StretchDraw(Rect(0,0,ScreenX,round(vImage.Picture.Bitmap.Height * ScreenX/vImage.Picture.Bitmap.Width)),vImage.Picture.Bitmap);
            vImage.Center := True;
            vBitmap3.Height := round(vImage.Picture.Bitmap.Height * ScreenX/vImage.Picture.Bitmap.Width);
            vBitmap3.Width := ScreenX;
            vBitmap3.Canvas.CopyRect(Rect(0,0,vBitmap3.Width,vBitmap3.Height), vImage.Canvas, Rect(0, 0, ScreenX, round(vImage.Picture.Bitmap.Height * ScreenX/vImage.Picture.Bitmap.Width)));
            vBitmap3.SaveToFile(vFileName);
          end
          else
            vImage.Picture.Bitmap.SaveToFile(vFileName);
        end
        else
        begin
          if vImage.Picture.Bitmap.Height >= ScreenY then
          begin
            vImage.Canvas.StretchDraw(Rect(0,0,ScreenX,ScreenY),vImage.Picture.Bitmap);
            vImage.Center := True;
            vBitmap3.Width := ScreenX;
            vBitmap3.Height := ScreenY;
            vBitmap3.Canvas.CopyRect(Rect(0,0,vBitmap3.Width,vBitmap3.Height), vImage.Canvas, Rect(0,0,ScreenX,ScreenY));
            vBitmap3.SaveToFile(vFileName);
          end
          else
            vImage.Picture.Bitmap.SaveToFile(vFileName);
        end;
      finally
        vImage.free;
      end;
    end;
      

  2.   

    估计你的Image1载入的不是BMP文件,要BMP才可以。
      

  3.   

    image只能载入bmp文件,如果是jpg文件要进行响应的转化。
      

  4.   

    同意sysu(死树) 和weibz0525(小虫) ,TCanvas只能对位图进行操作
      

  5.   

    谢谢各位。我的数码相机照的照片要进行处理后转化成Jpeg。已经收钱了。在此谢谢。