Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2004.10.03;
Скачать: CL | DM;

Вниз

Big Bitmap   Найти похожие ветки 

 
REA ©   (2004-07-06 13:39) [0]

Есть необходимость сделать (создать, нарисовать на его DC и сохранить) Bitmap достаточно большого размера под Winodоws 98. При попытке задать размер Bitmap выдается ошибка создания Bitmap. В справке по этому поводу написано, что Bitmap более 16Мб не создать, но на практике получается больше, хотя и упирается в какой-то предел. Знает кто-нибудь выход из положения?


 
MBo ©   (2004-07-06 13:48) [1]

размер строки - не более 64 кБ.
Общий размер тоже ограничен - 16 М похоже на правду.
1. попробовать делать битмап DIB, а не DDB (после создания указать HandleType или просто PixelFormat)
2. если не поможет, создавать не битмап, а DIB (отдельно заголовок и данные), отрисовка с помощью SetDIBitsToDevice


 
REA ©   (2004-07-06 14:11) [2]

>попробовать делать битмап DIB, а не DDB (после создания указать HandleType или просто PixelFormat)

DIB пробовал - кажется еще меньше получается. От PixеlFormat кое что зависит, но мне надо 24 бита.

>если не поможет, создавать не битмап, а DIB (отдельно заголовок и данные), отрисовка с помощью SetDIBitsToDevice

Отрисовка достаточно сложна и универсальна для принтеров и экрана. Используется стандартный вывод на DC. Есть ли возможность при этом подходе рисовать на DC?
Посмотрел исходники - черт ногу сломит - не хочется месяц с этой проблемой возиться.


 
MBo ©   (2004-07-06 14:27) [3]

>DIB пробовал - кажется еще меньше получается.
так не должно быть. при создании TBitmap без указания формата создается DDB, совместимый с экраном, а данные его хранятся в адресном пространстве ядра, в выгружаемом (или невыгружаемом?) пуле, который ограничен. DIB же находится в юзерском АП, которое теоретичски ограничено двумя гигами.

>От PixеlFormat кое что зависит, но мне надо 24 бита.
про PixеlFormat я сказал, поскольку его явное задание приводит к изменению типа битмапа на DIB.

>Есть ли возможность при этом подходе рисовать на DC?
вот пример (нелепый, правда).
А если сделать CreateDibSection, да еще Memory-Mapped File использовать - то будет удобнее (DibSection - создает объект типа HBITMAP)


type
pa=^ta;
ta=array[0..4999,0..4999] of TRGBTriple;
var
 a:pa;
 b:tbitmapinfo;
 i,j:integer;

implementation

{$R *.DFM}

procedure TForm1.Button1Click(Sender: TObject);
begin
b.bmiHeader.biSize:=SizeOf(b);
b.bmiHeader.biWidth:=5000;
b.bmiHeader.biHeight:=5000;
b.bmiHeader.biPlanes:=1;
b.bmiHeader.biBitCount:=24;
b.bmiHeader.biCompression:=BI_RGB;
for j:=0 to 4999 do
 for i:=0 to 4999 do begin
   if (j mod 40<20)   then a^[j,i].rgbtBlue:=0
     else a^[j,i].rgbtBlue:=255;
   if (i mod 40<20)   then a^[j,i].rgbtRed:=0
     else a^[j,i].rgbtRed:=255;
   a^[j,i].rgbtGreen:=0;
 end;
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
SetDIBitsToDevice(canvas.handle,0,0,100,100,0,0,0,5000,a,b,DIB_RGB_COLORS);
end;

procedure TForm1.FormDestroy(Sender: TObject);
begin
dispose(a);
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
new(a);
end;

procedure TForm1.Button3Click(Sender: TObject);
begin
StretchDIBits(canvas.handle,0,0,200,200,1000,1000,1000,1000,a,b,DIB_RGB_COLORS,srccopy);
end;



 
REA ©   (2004-07-06 17:01) [4]

С DIB и правда получше (не знаю почему раньше не получалось - видимо последовательность другая была) - файлы до 100Мб (примерно 25000 пикселов в высоту) нормально формируются. Больше правда опять ошибка вылезает.

>А если сделать CreateDibSection, да еще Memory-Mapped File использовать - то будет удобнее

Насколько большие файлы можно формировать при этом подходе?
Можно ли рисовать обычными GDI API функциями?


 
MBo ©   (2004-07-06 17:08) [5]

>Насколько большие файлы можно формировать при этом подходе?
увы, сразу не скажу

>Можно ли рисовать обычными GDI API функциями?
да


 
MBo ©   (2004-07-06 17:20) [6]

> файлы до 100Мб (примерно 25000 пикселов в высоту) нормально формируются. Больше правда опять ошибка вылезает.

Доктор, а откуда у вас такие картиночки?! ;)))
Полагаю, при любом варианте держать такие объемы одновременно в памяти - насилие над виндами и компьютером. Не лучше ли разделить гигантскую картину на квадратные кусочки разумного размера, и отрисовывать нужные части по отдельности? Такой подход будет не медленнее, поскольку маппирование сотен мег будет сопровождаться большими накладными расходами - свопированием на диск, например.


 
REA ©   (2004-07-07 10:19) [7]

>Доктор, а откуда у вас такие картиночки?! ;)))

Да вот заказчики хотят видеть и печатать диаграмму вдлину на рулонном принтере. Такую картинку уже не всякая смотрелка берет.
Получается страниц 20 в 96dpi - сойдет. Бред конечно.
В pdf рендерить пока не пробовал.

>Не лучше ли разделить гигантскую картину на квадратные кусочки >разумного размера, и отрисовывать нужные части по отдельности?

Лучше, но они хотят одним. Думаю пока так сойдет, а потом постараюсь их убедить, что электронный вид документов это круто.
Тем более, что Gif формируется с нее довольно долго и по почте передать это проблематично даже в архиве.


 
DimKa ©   (2004-07-07 13:14) [8]

Можно формировать Stretch прям из файла на диске - считал часть, уменьшил, вставил на экран, считал, уменьшил, добабил к предыдущему. Все изображение на экране будет, хоть и уменьшенное, а печатать опять же из файла. Я таким способом большие изображения на экран вывожу (где-то до 4 Гб будет нужно).


 
Думкин ©   (2004-07-07 13:33) [9]

> [7] REA ©   (07.07.04 10:19)
> >Не лучше ли разделить гигантскую картину на квадратные
> кусочки >разумного размера, и отрисовывать нужные части
> по отдельности?
>
> Лучше, но они хотят одним. Думаю пока так сойдет, а потом
> постараюсь их убедить, что электронный вид документов это
> круто.

А теперь вопрос: как Photoshop работает с картинками и печатает их(!) размер которых измеряется метрами(в системе СИ).


 
zorik ©   (2004-07-07 14:24) [10]

Я когдато тоже похожее делал. SetDIBitsToDevice хорошо работает только для 100% отображения (пиксел изображения равен пикселу екрана). Потом я сделал так: создаю Bitmap, TBitmap.LoadFromFile(FileName) и написал процедуру которая отображает нужний кусок изображения на TPaintBox. В процедуре использовалась функция TBitmap.Canvas.CopyRect. Параметрами функции били TBitmap, масштаб и положение ползунков прокрутки. С файлами в районе 200Мб справлялась.


 
MBo ©   (2004-07-07 14:34) [11]

>SetDIBitsToDevice хорошо работает только для 100% отображения
Естественно, для другого StretchDIBits имеется.


 
REA ©   (2004-07-08 10:58) [12]

>А теперь вопрос: как Photoshop работает с картинками и печатает их(!) размер которых измеряется метрами(в системе СИ).

Дык я же не Adobe. Им не слабо свое чтение/запись сделать и т.п.
И кстати файлик который я сделал (86М) IrfanView открыл, а фотошоп 7 сказал, что у него проблема с этим.



Страницы: 1 вся ветка

Текущий архив: 2004.10.03;
Скачать: CL | DM;

Наверх




Память: 0.5 MB
Время: 0.389 c
4-1093514021
dms_main
2004-08-26 13:53
2004.10.03
Меню


1-1095271355
Bober
2004-09-15 22:02
2004.10.03
Перенос проекта на WinXp (русские шрифты)


1-1095228689
Fedia
2004-09-15 10:11
2004.10.03
Синхронизация в потоке


3-1094046818
Heretic
2004-09-01 17:53
2004.10.03
Регистрация Ehlib


1-1095276056
lipskiy
2004-09-15 23:20
2004.10.03
Почему ComponentCount не включает в себя динамические объекты?