从下到上将图像拆分为多个图像

split image to multiple image from the bottom up

我有一张图片要打印,但是一页纸太大了 所以我决定把它分成多张图片 我已经尝试过一种方法,但现在我正在使用 this(Talha Irfan 回答) 我也在那里尝试了其他解决方案,但那些并没有奏效 (例如 bm.Clone(rec, bm.PixelFormat);

这是我的代码(这是非形式 class)

  Bitmap bm = new Bitmap(frmPrint.Width, frmPrint.Height);
  Rectangle rec = new Rectangle(0, 200, 576, 300); 
  Bitmap bitmap = cropImg(bm, rec);   

 frmPrint.DrawToBitmap(bitmap, rec);
 frmPrint._img = bitmap;
 frmPrint.setImage();

和 setImage 函数(在某种形式上)

  public void setImage()
  {
      pictureBox3.BackgroundImage = _img;       
      this.ShowDialog();
  }

cropImg等同于cropAtRect

下图为原图(左) 蓝色矩形中想要的结果 和右边的实际结果

PS 我的实际图像大小是 (height = 698, wifht = 576)

编辑 - 按照下面的建议

非表格 class

 Rectangle cropRect = new Rectangle(0, 0, 576, 698); 
  Bitmap target = new Bitmap(cropRect.Width, cropRect.Height, bm.PixelFormat);
  frmPrint.setImage(bm, target, cropRect);
  target.Dispose();

形式 class

  public void setImage(Bitmap src, Bitmap target, Rectangle cropRect)
    {


        pictureBox3.Visible = false;
        using (Graphics g = Graphics.FromImage(target))
        {
            g.DrawImage(src, new Rectangle(pictureBox3.Location.X, pictureBox3.Location.Y, target.Width, target.Height),
                             cropRect,
                             GraphicsUnit.Pixel);
        }      
        this.ShowDialog();
    }

Control.DrawToBitmap 将始终尝试绘制整个控件或窗体,并且始终从顶部开始。参数:

targetBounds Type: System.Drawing.Rectangle

The bounds within which the control is rendered.

顾名思义,设置 target,而不是 source 矩形。因此,结果上方的白色 space。

在裁剪之前用一个包含整个区域的矩形移动线条,可能是这样的:

DrawToBitmap(bm, ClientRectangle);

然后像以前一样裁剪下半部分..

请注意,您 link 的裁剪技巧不适用于 DrawToBitmap;使用具有负偏移量的矩形将导致参数异常。


顺便说一句:要安全地处理 PictureBox 中的位图,请使用:

Bitmap dummy = (Bitmap )somePictureBox.Image;
somePictureBox.Image = null;
if (dummy != null) dummy.Dispose;

事实上,ChrisJJ 在 link 中的回答泄露了 Graphics 对象。


更新:

由于您似乎无法控制各种更改和建议,这里是对原始 post 的最小代码更改:

Bitmap bm = new Bitmap(frmPrint.ClientWidth, frmPrint.ClientHeight);
DrawToBitmap(bm, frmPrint.ClientRectangle);

Rectangle rec = new Rectangle(0, 200, 576, 300); 
Bitmap bitmap = cropImg(bm, rec);   

frmPrint._img = bitmap;
frmPrint.setImage();

有:

public void setImage()
{
   Bitmap dummy = pictureBox3.BackgroundImage;
   pictureBox3.BackgroundImage = null;
   if (dummy != bnull) dummy.Dispose();
   pictureBox3.BackgroundImage = _img;       
   this.ShowDialog();
}

cropImg函数返回前加一个g.Dispose