从下到上将图像拆分为多个图像
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
。
我有一张图片要打印,但是一页纸太大了
所以我决定把它分成多张图片
我已经尝试过一种方法,但现在我正在使用 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
。