Skip to main content
 首页 » 编程设计

c#之Bitmap 的辅助方法和正确处理 C#

2024年02月05日34mfrbuaa

我有一个辅助方法,它使用自己的 using 语句创建位图。最初我有一个问题,当返回由 using 语句控制的对象时,一旦离开范围,它就会被处理掉。所以,在这个 article 的帮助下,我能够弄清楚这也是我的问题。

所以我返回一个克隆版本并将它传递给 Graphics 类的 DrawImage,就像这样,

g.DrawImage(getInputDataImage(dr.DRODAT, oFont, 430, 87, black, white, Color.Transparent), new Point(280, 23)); //DATE 

获取输入数据图像:

 public static Image getInputDataImage(... 
 { 
        using(Bitmap bitmap = new Bitmap(width, height)) 
        using (Graphics graphics = Graphics.FromImage(bitmap)) 
        using(var format = new StringFormat{Alignment = StringAlignment.Center, LineAlignment = StringAlignment.Center}) 
        { 
            //set coordinates on canvas to put barcode 
            Point point = new Point(50, 50); 
 
            RectangleF layoutRectangle = new RectangleF(new PointF(0, 0), new SizeF(bitmap.Width, bitmap.Height)); 
            graphics.Clear(color); 
            graphics.DrawString(text, font, fontBrush, layoutRectangle, format); 
 
            return (Bitmap)bitmap.clone(); 
        } 
 
 } 

DrawImage 会在它使用的类的析构函数中调用 dispose 吗?像这样使用时我应该如何处理 Bitmap 类?在某些情况下,我调用 getInDataImage 辅助方法时每次都会返回一个新对象。试图了解如何保持这种处理方式。

从帮助程序返回原始对象而不是将其包装在 using 语句中,并在 main 方法中处理它是否更好?

请您参考如下方法:

尝试在不使用“using”语句且不克隆它的情况下从辅助方法返回位图对象本身。

在你的调用者中,创建一个新对象然后处理:

using(Bitmap b = getInputDataImage(...)) 
{ 
    g.DrawImage(b, new Point(...)); 
    // Do anything else I need to do with "b" 
} 
// "b" is now disposed of, I can't use it here 

当您使用“using”时,一旦代码退出这些括号,您就释放了该对象。因此,当您创建一个对象时,您希望它在使用时处于事件状态,然后您想要处置它。

处理此问题的最佳方法是在尽可能高的级别。在辅助方法中处理 Graphics 对象是有意义的,因为它永远不会离开该方法的范围。但是,您想要的 Bitmap 确实保留了该方法,因此您不想在调用者使用它之前处理它。那么,从逻辑上讲,调用者将负责处理它。