Рисование больших картинок в BCB 6.0
От: de cobre Россия  
Дата: 15.12.06 14:26
Оценка:
Требуется нарисовать большую картинку. Сама картинка проста — состоит из обычных графических примитивов типа: линии, прямоугольники, эллипсы, т.е. всё это очень просто рисуется методами TCanvas. Проблема возникает когда пытаемся рисовать картинку размерами примерно 8000 х 8000 пикселов. При первой же попытке использовать любой из методов холста (без разницы какой) выскакивает рантайм исключение о том, что недостаточно памяти для завершения данной операции, что не удивительно, если перемножить разрядность пиксела на их общее количество. Как можно это побороть? Вариант на вскидку — каким-то образом уменьшить разрядность холста, т.к. мне не нужно полноценного многоцветия. Только вот пока не найду как это сделать в билдере. Находил вроде бы похожий по функционалу код на делфях, но в билдере данный момент (изменение разрядности) реализован иначе. Или я что-то не так понял, тогда прошу пояснить.

ЗЫ Может кто-то подскажет другой метод рисования?
Re: Рисование больших картинок в BCB 6.0
От: Danchik Украина  
Дата: 15.12.06 14:46
Оценка:
Здравствуйте, de cobre, Вы писали:

DC>Требуется нарисовать большую картинку. Сама картинка проста — состоит из обычных графических примитивов типа: линии, прямоугольники, эллипсы, т.е. всё это очень просто рисуется методами TCanvas. Проблема возникает когда пытаемся рисовать картинку размерами примерно 8000 х 8000 пикселов. При первой же попытке использовать любой из методов холста (без разницы какой) выскакивает рантайм исключение о том, что недостаточно памяти для завершения данной операции, что не удивительно, если перемножить разрядность пиксела на их общее количество. Как можно это побороть? Вариант на вскидку — каким-то образом уменьшить разрядность холста, т.к. мне не нужно полноценного многоцветия. Только вот пока не найду как это сделать в билдере. Находил вроде бы похожий по функционалу код на делфях, но в билдере данный момент (изменение разрядности) реализован иначе. Или я что-то не так понял, тогда прошу пояснить.


DC>ЗЫ Может кто-то подскажет другой метод рисования?


Уточните детали.
Вы рисуете на дескрипторе экрана картинку (Bitmap 8000x8000). И у вас при вызове Canvas.Draw(X, Y, Bitmap) вылетает ошибка.
Правильно я понял?
Re[2]: Рисование больших картинок в BCB 6.0
От: de cobre Россия  
Дата: 15.12.06 15:41
Оценка:
Здравствуйте, Danchik, Вы писали:

D>Уточните детали.

D>Вы рисуете на дескрипторе экрана картинку (Bitmap 8000x8000).
Я видимо криво объяснил.
В данном случае рисование происходит на Panel->Canvas. Но это совершенно не принципиально, т.к. например если использовать TBitmap объект, то при задание такого же размера вылетает точно такой же трабл.
D>И у вас при вызове Canvas.Draw(X, Y, Bitmap) вылетает ошибка.
Например при: Panel->Canvas->Pen->Color = clBlack;
В общем, совершенно не принципиально какой метод будет вызван после Panel->Canvas->* сразу вылетает ошибка. Видимо инициализация битовой матрицы происходит не сразу а при вызове любого из методов холста, с этим и связано появление ошибки.
Re[3]: Рисование больших картинок в BCB 6.0
От: Dimonka Верблюд  
Дата: 15.12.06 15:55
Оценка:
Здравствуйте, de cobre, Вы писали:

DC>Я видимо криво объяснил.

DC>В данном случае рисование происходит на Panel->Canvas. Но это совершенно не принципиально, т.к. например если использовать TBitmap объект, то при задание такого же размера вылетает точно такой же трабл.
DC>В общем, совершенно не принципиально какой метод будет вызван после Panel->Canvas->* сразу вылетает ошибка. Видимо инициализация битовой матрицы происходит не сразу а при вызове любого из методов холста, с этим и связано появление ошибки.

Вопрос весь в том — нужно рисование не экране или всё же на картинке?

Выделение пары сотен мегабайт чисто для того, чтобы нарисовать несколько линий, думаю, не совсем раумный вариант. Если же нужно сохранение в файл, то имеет смысл подумать о проецировании файлов в память и "рисовать" прямо в файл.
Где-то тут пробегали раньше притензии к битмапу, что существуют какие-то ограничения по размеру.

Как вариант можно попробовать разбивать на блоки 1000х1000 или ещё меньшие и работать с блоками. На сколько я знаю, фотошоп именно так и поступает.

Короче задача мне видится более комплексной, чем просто создать битмап 8000х8000
Re[4]: Рисование больших картинок в BCB 6.0
От: Danchik Украина  
Дата: 15.12.06 16:07
Оценка:
Здравствуйте, Dimonka, Вы писали:

D>Здравствуйте, de cobre, Вы писали:


DC>>Я видимо криво объяснил.

DC>>В данном случае рисование происходит на Panel->Canvas. Но это совершенно не принципиально, т.к. например если использовать TBitmap объект, то при задание такого же размера вылетает точно такой же трабл.
DC>>В общем, совершенно не принципиально какой метод будет вызван после Panel->Canvas->* сразу вылетает ошибка. Видимо инициализация битовой матрицы происходит не сразу а при вызове любого из методов холста, с этим и связано появление ошибки.

D>Вопрос весь в том — нужно рисование не экране или всё же на картинке?


D>Выделение пары сотен мегабайт чисто для того, чтобы нарисовать несколько линий, думаю, не совсем раумный вариант. Если же нужно сохранение в файл, то имеет смысл подумать о проецировании файлов в память и "рисовать" прямо в файл.

D>Где-то тут пробегали раньше притензии к битмапу, что существуют какие-то ограничения по размеру.

D>Как вариант можно попробовать разбивать на блоки 1000х1000 или ещё меньшие и работать с блоками. На сколько я знаю, фотошоп именно так и поступает.


D>Короче задача мне видится более комплексной, чем просто создать битмап 8000х8000


Я наводил на мысль что нужно создавать Device Independed Bitmap (DIB) — в памяти, так как в Device Depended Bitmap (DDB) размер ограничен видеопамятью вашей карточки.
Bitmap.HandleType := bmDIB;

А рисовать, я думаю, вы такую картинку сможете. Тут уже Windows само об этом подумает.
Re[4]: Рисование больших картинок в BCB 6.0
От: de cobre Россия  
Дата: 15.12.06 16:13
Оценка:
Здравствуйте, Dimonka, Вы писали:

D>Вопрос весь в том — нужно рисование не экране или всё же на картинке?

Рисовать нужно только на экране, т.е. в данном случае на объекте TCanvas, сохранять никуда не нужно. Нужно только отобразить это на экране.
D>Где-то тут пробегали раньше притензии к битмапу, что существуют какие-то ограничения по размеру.
Видимо с ними и воюем.
D>Как вариант можно попробовать разбивать на блоки 1000х1000 или ещё меньшие и работать с блоками. На сколько я знаю, фотошоп именно так и поступает.
Это уже сделано, т.е. не совсем так. Если размер картинки больше чем 3000х3000 (такая нормально создается на всех проверенных компах), то отисовывается только видимая часть картинки. Но тогда имеем трабл при перерисовке изображения, т.к. заметно мерцание, что не есть очень хорошо. Ладно, подумаем над оптимизацией алгоритма разбиения на части.
Если кто-нибудь предложит еще какие-нибудь варианты, то буду очень благодарен. Но всё же, мне кажется, что можно каким-то образом снизить разрядность битмапа. Если найду сам, то выложу решение...
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.