Форум: "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.048 c