Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Media";
Текущий архив: 2004.10.03;
Скачать: [xml.tar.bz2];

Вниз

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 вся ветка

Форум: "Media";
Текущий архив: 2004.10.03;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.49 MB
Время: 0.044 c
1-1095236000
cvc
2004-09-15 12:13
2004.10.03
Делфи и Windows Mobile 2003?


3-1094112903
dumitru
2004-09-02 12:15
2004.10.03
bde -> ado


1-1095262239
Slaviq
2004-09-15 19:30
2004.10.03
Печать через темопринтер BZ-2


1-1095222353
ККВ
2004-09-15 08:25
2004.10.03
Деньги


1-1095682967
Zhekson
2004-09-20 16:22
2004.10.03
InputQuery или как реагировать на кнопки Ok и Cancel





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский