Класс C # Graphics: получить размер нарисованного содержимого

Я динамически пишу объект Graphics и не знаю фактического размера конечного изображения, пока не будут переданы все выходные данные.

Итак, я создаю большое изображение и создаю из него объект Graphics:

int iWidth = 600;
int iHeight = 2000;

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

Как я могу найти фактический размер написанного контента, чтобы я мог создать новый растровый рисунок с этим размером и скопировать в него контент.

Очень сложно рассчитать размер содержимого перед его рисованием, и вы хотите знать, есть ли какое-либо другое решение.


person StreamT    schedule 17.03.2010    source источник
comment
Я не понимаю вашего вопроса. Вы создаете новое пустое растровое изображение определенного размера. Вы получаете графическую поверхность из этого растрового изображения. Затем вы заполняете эту графическую поверхность белым цветом. Здесь нет ничего, что указывало бы на изменение размера.   -  person Jacob G    schedule 17.03.2010


Ответы (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;
}

Опять же, я не рекомендую это как решение, но оно будет делать то, что вы хотите, без необходимости отслеживать координатное пространство, которое вы фактически используете.

person Adam Robinson    schedule 17.03.2010
comment
Спасибо! Следите за максимальными значениями X и Y, которые используются, так как отрисовка будет работать для меня. - person StreamT; 17.03.2010
comment
Я предполагаю, что обрезка слева или сверху не произойдет? - person Jacob G; 17.03.2010
comment
@Jacob: Это было мое предположение, но любой шаблон можно было бы довольно легко адаптировать для учета этого. - person Adam Robinson; 17.03.2010