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

Модераторы: Duncon, Naeel Maqsudov, Игорь Акопян, Хыиуду

Аватара пользователя
somewhere
Сообщения: 1858
Зарегистрирован: 31 авг 2006, 17:14
Откуда: 71 RUS
Контактная информация:

&quot писал(а):
Да оперативки та немного 196 Мб, но я думаю может причина в Windows 2000.
Вспоминаю когда стояла XP вроде не было такой проблеммы..
Что скажешь?
На 95% возможно в этом. Тип TBitmap - наследник стандартного виндового битмапа. Возможно в Win2K было такое ограничение. Или файл подкачки слижком мал, или ограничение состоит в том, что часть битмапа не может быть в виртуальной памяти. Касательно моего примера - система ХР, оперативы 2Гб - так что проверить на 192М не получиться.
It's a long way to the top if you wanna rock'n'roll
familytree
Сообщения: 8
Зарегистрирован: 12 апр 2007, 15:46

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

Проблему до конца решить не удалось.
А проблема в дефрагментации памяти.
Для TImage нужен цельный кусок памяти.
Если перезагрузить комп и удалить из памяти все лишнее, то TImage получается больше 104 Мб даже при моей маленькой оперативке.
Нужна какая процедура на Delphi, которая дефрагметировала бы оперативную память компа.
Может кто встречал в инете?
Если найду, напишу в форум.
Всех благ
Absurd
Сообщения: 1228
Зарегистрирован: 26 фев 2004, 13:24
Откуда: Pietari, Venäjä
Контактная информация:

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
Вложения
arc.zip
(11.97 КБ) 17 скачиваний
2B OR NOT(2B) = FF
Ответить