C# 清除图像并在其上绘制信息
嗨,我想在c#中的图像上绘制一些信息。我写了这段代码,它可以工作:C# 清除图像并在其上绘制信息,c#,drawing,C#,Drawing,嗨,我想在c#中的图像上绘制一些信息。我写了这段代码,它可以工作: Bitmap bmp = new Bitmap(@"G:\Cert_template.png"); Graphics g = Graphics.FromImage(bmp); g.DrawString(cert_id, new Font("B Zar", 3,System.Drawing.FontStyle.Bold), Brushes.Black, new Point(85, 95)); g.DrawString(date_
Bitmap bmp = new Bitmap(@"G:\Cert_template.png");
Graphics g = Graphics.FromImage(bmp);
g.DrawString(cert_id, new Font("B Zar", 3,System.Drawing.FontStyle.Bold), Brushes.Black, new Point(85, 95));
g.DrawString(date_cert, new Font("B Zar", 3, System.Drawing.FontStyle.Bold), Brushes.Black, new Point(85, 135));
g.DrawString(s1 + s3, new Font("B Zar", 4, System.Drawing.FontStyle.Bold), Brushes.Black, new Point(90, 290));
g.DrawString(s4, new Font("B Zar", 3, System.Drawing.FontStyle.Bold), Brushes.Black, new Point(480, 360));
g.DrawString(date_exam, new Font("B Zar", 3, System.Drawing.FontStyle.Bold), Brushes.Black, new Point(170, 515));
g.DrawString(Convert.ToString(mark), new Font("B Zar", 3, System.Drawing.FontStyle.Bold), Brushes.Black, new Point(520, 600));
g.DrawString(lvl, new Font("B Zar", 3, System.Drawing.FontStyle.Bold), Brushes.Black, new Point(150, 600));
g.DrawString(prvnc, new Font("B Zar", 3, System.Drawing.FontStyle.Bold), Brushes.Black, new Point(170, 780));
g.DrawString(center, new Font("B Zar", 3, System.Drawing.FontStyle.Bold), Brushes.Black, new Point(310, 870));
g.DrawString(inst, new Font("B Zar", 3, System.Drawing.FontStyle.Bold), Brushes.Black, new Point(150, 870));
CaptureScreen(g,imgCounter);
我写的所有信息的图像都是一样的。我把这段代码放在一个循环中,它绘制了图像,但对于不同的信息,它覆盖了前面的图像。我想清除图像并在其上再次写入而不覆盖
编辑
之后,我将g
发送到一个函数,以便在图片框中显示:
private void CaptureScreen(Graphics g,int imgCounter)
{
/*This method captures a snapshot of screen and
* adds it to the ImageFlowLayoutPanel
*/
bmp.Save("snap" + imgCounter.ToString() + ".png", System.Drawing.Imaging.ImageFormat.Png);
//creating a picturebox control and add it to the flowlayoutpanel
PictureBox tempPictureBox = new PictureBox();
//generates a thumbnail image of specified size
tempPictureBox.SizeMode = PictureBoxSizeMode.StretchImage;
tempPictureBox.Image = bmp.GetThumbnailImage(600, 700,
new Image.GetThumbnailImageAbort(ThumbnailCallback),
IntPtr.Zero);
tempPictureBox.Size = new System.Drawing.Size(50,50);
tempPictureBox.Click += new EventHandler(this.tempPictureBox_Click);
ImageFlowLayoutPanel.Controls.Add(tempPictureBox);
}
//This click event will be used to display the enlarged images
private void tempPictureBox_Click(object sender, EventArgs e)
{
PreviewPictureBox.Image = ((PictureBox)sender).Image;
}
public bool ThumbnailCallback()
{
return true;
}
一种可能是在原始位图的基础上创建一个临时位图, 对于每个周期 请不要以为我让你的图形实例立即被处置 当不再需要时(通过using子句),请注意图形实例 是在
newBitmap
的基础上构建的,而不是在原始地图的基础上构建的
还要确保在循环结束时使用newBitmap
参考
而不是仅保存原始背景的bmp
引用
Bitmap bmp = new Bitmap(@"G:\Cert_template.png");
for ( ... ) {
Bitmap newBitmap = new Bitmap(bmp);
using (Graphics g = Graphics.FromImage(newBitmap)) {
// somehow alter cert_id, date_cert, etc...
g.DrawString(cert_id, new Font("B Zar", 3,System.Drawing.FontStyle.Bold), Brushes.Black, new Point(85, 95));
g.DrawString(date_cert, new Font("B Zar", 3, System.Drawing.FontStyle.Bold), Brushes.Black, new Point(85, 135));
g.DrawString(s1 + s3, new Font("B Zar", 4, System.Drawing.FontStyle.Bold), Brushes.Black, new Point(90, 290));
g.DrawString(s4, new Font("B Zar", 3, System.Drawing.FontStyle.Bold), Brushes.Black, new Point(480, 360));
g.DrawString(date_exam, new Font("B Zar", 3, System.Drawing.FontStyle.Bold), Brushes.Black, new Point(170, 515));
g.DrawString(Convert.ToString(mark), new Font("B Zar", 3, System.Drawing.FontStyle.Bold), Brushes.Black, new Point(520, 600));
g.DrawString(lvl, new Font("B Zar", 3, System.Drawing.FontStyle.Bold), Brushes.Black, new Point(150, 600));
g.DrawString(prvnc, new Font("B Zar", 3, System.Drawing.FontStyle.Bold), Brushes.Black, new Point(170, 780));
g.DrawString(center, new Font("B Zar", 3, System.Drawing.FontStyle.Bold), Brushes.Black, new Point(310, 870));
g.DrawString(inst, new Font("B Zar", 3, System.Drawing.FontStyle.Bold), Brushes.Black, new Point(150, 870));
// and here you do something with your newBitmap instance
// (for example: you save it to another filename)
}
}
先画一些矩形作为背景。。。或者还有一些其他问题(不清楚您试图覆盖什么以及您试图保留什么)。我正在绘制的所有信息,例如证书id、日期证书,。。。将会改变,最后我必须有多达20个不同信息的图像。问题是当它被覆盖时,文本会被弄乱。你的问题是“如何在一个循环中创建20个图像”?您缺少该部分代码(并且可以安全地将示例中的所有
DrawString
代码替换为单个g.DrawString(index.ToString()…)
;调用以使示例变小。g.DrawString(index.ToString()…)有什么作用
怎么做?我应该放什么来代替…
?我只是想表明,您只需要调用DrawString
,就可以演示您正在尝试做什么。绝对没有理由在示例中发布10多行几乎相同的行,因此,如果您有问题的清晰代码示例,我将不胜感激我试过了,一切都清楚了。我只想弄清楚我画的东西,重新画出新的信息。你能说g=Graphics.FromImage(bmp)吗
再次?还是不想永久清除更改?您没有说该特定图像最初存在背景。这就是您要说的吗?您没有提到。请查看最新编辑。现在它应该保留背景