2010-03-17 73 views
0

我正在动态写入一个Graphics对象,并且直到所有输出都被传递时才知道最终图像的实际大小。C#图形类:获取绘制内容的大小

所以,我创建了一个大的图像,并从它创建图形对象:

int iWidth = 600; 
int iHeight = 2000; 

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

我如何才能找到的书面内容的实际大小,所以我将能够创建一个新的位图与这种规模和将内容复制到它。

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

+0

我不明白你的问题。您创建一个特定大小的新的空白位图。您从该位图获得图形表面。然后用白色填充该图形表面。这里没有任何东西可以显示尺寸变化。 – 2010-03-17 18:22:42

回答

2

最好的解决方案可能是跟踪绘制时使用的最大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; 
} 

同样,我不建议这作为一种解决方案,但你想要做什么,而你不必跟踪你实际使用的坐标空间。

+0

谢谢!保持跟踪绘制时使用的最大X值和Y值对我有用。 – StreamT 2010-03-17 18:26:43

+0

我假设剪掉左边或顶部不会发生? – 2010-03-17 18:29:09

+0

@Jacob:那是我的假设,但是任何一种模式都可以很容易地适用于解释这一点。 – 2010-03-17 18:39:06