【问题标题】:C# Graphics class: get size of drawn contentC# Graphics 类:获取绘制内容的大小
【发布时间】:2026-02-25 09:55:02
【问题描述】:

我正在动态写入 Graphics 对象,直到所有输出都通过后才知道最终图像的实际大小。

所以,我创建了一个大图像并从中创建了 Graphics 对象:

int iWidth = 600;
int iHeight = 2000;

bmpImage = new Bitmap(iWidth, iHeight);            
graphics = Graphics.FromImage(bmpImage);
graphics.Clear(Color.White);        

我怎样才能找到写入内容的实际大小,这样我就可以用这个大小创建一个新的位图并将内容复制到它。

在绘制之前真的很难计算内容大小,想知道是否有其他解决方案。

【问题讨论】:

  • 我不明白你的问题。您创建一个新的、特定大小的空位图。您可以从该位图中获得图形表面。然后用白色填充该图形表面。这里没有任何迹象表明尺寸发生了变化。

标签: c# image graphics drawing bitmap


【解决方案1】:

最好的解决方案可能是跟踪绘制时使用的最大 X 和 Y 值,尽管这将是一个完全手动的过程。

另一种选择是扫描位图的完整行和列(从右侧和底部开始),直到遇到非白色像素,但这将是一个非常低效的过程。

int width = 0;
int height = 0;

for(int x = bmpImage.Width - 1, x >= 0, x++)
{
    bool foundNonWhite = false;

    width = x + 1;

    for(int y = 0; y < bmpImage.Height; y++)
    {
        if(bmpImage.GetPixel(x, y) != Color.White)
        {
            foundNonWhite = true;
            break;
        }
    }

    if(foundNonWhite) break;
}

for(int y = bmpImage.Height - 1, x >= 0, x++)
{
    bool foundNonWhite = false;

    height = y + 1;

    for(int x = 0; x < bmpImage.Width; x++)
    {
        if(bmpImage.GetPixel(x, y) != Color.White)
        {
            foundNonWhite = true;
            break;
        }
    }

    if(foundNonWhite) break;
}

同样,我不建议将其作为解决方案,但它做你想做的事,而无需跟踪你实际使用的坐标空间.

【讨论】:

  • 谢谢!跟踪用作绘制的最大 X 和 Y 值对我有用。
  • 我假设不会发生左侧或顶部的剪裁?
  • @Jacob:这是我的假设,但任何一种模式都可以很容易地适应这一点。