Страница 2 из 2

Re: Как увеличить максимальный объем TImage больше 64Мб

Добавлено: 13 апр 2007, 12:00
somewhere
&quot писал(а):
Да оперативки та немного 196 Мб, но я думаю может причина в Windows 2000.
Вспоминаю когда стояла XP вроде не было такой проблеммы..
Что скажешь?
На 95% возможно в этом. Тип TBitmap - наследник стандартного виндового битмапа. Возможно в Win2K было такое ограничение. Или файл подкачки слижком мал, или ограничение состоит в том, что часть битмапа не может быть в виртуальной памяти. Касательно моего примера - система ХР, оперативы 2Гб - так что проверить на 192М не получиться.

Re: Как увеличить максимальный объем TImage больше 64Мб

Добавлено: 13 апр 2007, 20:16
familytree
somewhere писал(а):На 95% возможно в этом. Тип TBitmap - наследник стандартного виндового битмапа. Возможно в Win2K было такое ограничение. Или файл подкачки слижком мал, или ограничение состоит в том, что часть битмапа не может быть в виртуальной памяти. Касательно моего примера - система ХР, оперативы 2Гб - так что проверить на 192М не получиться.
ОК. Придется ставить ХР. Может поможет...

Re: Как увеличить максимальный объем TImage больше 64Мб

Добавлено: 15 апр 2007, 10:19
familytree
Проблему до конца решить не удалось.
А проблема в дефрагментации памяти.
Для TImage нужен цельный кусок памяти.
Если перезагрузить комп и удалить из памяти все лишнее, то TImage получается больше 104 Мб даже при моей маленькой оперативке.
Нужна какая процедура на Delphi, которая дефрагметировала бы оперативную память компа.
Может кто встречал в инете?
Если найду, напишу в форум.
Всех благ

Re: Как увеличить максимальный объем TImage больше 64Мб

Добавлено: 15 апр 2007, 16:10
Absurd
familytree писал(а):Проблему до конца решить не удалось.
А проблема в дефрагментации памяти.
Для TImage нужен цельный кусок памяти.
Если перезагрузить комп и удалить из памяти все лишнее, то TImage получается больше
Я тут работал раньше с большими картинками.
Писал на С, на Дельфи скорее спортировал криво:
Самый простой вариант выглядит так:

Код: Выделить всё

procedure TPaintSurface.readFile(fileName: string);
var
  rawData : ^byte;
  bitCount : integer;
begin
  {Убираем остатки старого файла}
  cleanup;
  {Открываем файл}
  hFile := CreateFile(PChar(fileName),
      GENERIC_READ, 0, nil, OPEN_EXISTING, 0, 0);
  {Создаем объект ядра типа маппинг}
  hMapping := CreateFileMapping(hFile, nil, PAGE_READONLY, 0, 0, nil);
  {Отображаем его на память}
  pFileContents := MapViewOfFile(hMapping, FILE_MAP_READ, 0, 0, 0);
  rawData := pFileContents;
  {Расставляем указатели. Сначала идет BitmapFileHeader}
  PaintSurface.pBitmapFileHeader := Pointer(rawData);
  Inc(rawData, SizeOf(TBitmapFileHeader));
  {Потом идет BitmapInfoHeader}
  PaintSurface.pBitmapInfoHeader := Pointer(rawData);
  PaintSurface.pBitmapInfo := Pointer(rawData);
  Inc(rawData, SizeOf(TBitmapInfoHeader));
  bitCount := (PaintSurface.pBitmapInfoHeader^).biBitCount;
  {Если количество бит на пиксель 8 или меньше, то дальше идет палитра.
  Иначе - сами сканлинии}
  if (bitCount <= 8) then
    begin
      PaintSurface.pPalette := Pointer(rawData);
      Inc(rawData, SizeOf(TRgbQuad) * (1 shl bitCount));
    end
  else
    begin
      PaintSurface.pPalette := nil;
    end;
  PaintSurface.pRawImageData := Pointer(rawData);
end;
Вложил проект на Дельфи, должен собираться Delphi 3