Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 01.02.2022, 03:33   #1
Kronos913
Форумчанин
 
Регистрация: 10.02.2021
Сообщений: 627
По умолчанию Отловить проблемы с памятью

Недавно в программу загрузил сразу 40 больших фотографий (5000х3000 примерно)
На загрузке 25й фотографии программа выдала ошибку - нехватка памяти

В принципе, я придумал решение для проблемы, которое сначала загружает изображение в BitMap, и если его размеры превышают какое-то там значение - то сначала изображение уменьшается, а потом только загружается

Решение вроде как и хорошее, но теперь все фотографии стали грузиться дольше. Так что тоже решение не очень...

Вопрос такой: как отловить ошибку перегрузки памяти? Так чтобы сжатие применять только в случае перегруза, а иначе загружать все как обычно?

И при этом не перепутать ошибку перегруза памяти с ошибкой чтения файла
Kronos913 вне форума Ответить с цитированием
Старый 01.02.2022, 07:10   #2
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,291
По умолчанию

Код:
  try
    loadBig();
  except
     on EOutOfMemory do loadSmall();
  end;
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )
BDA на форуме Ответить с цитированием
Старый 01.02.2022, 11:49   #3
ForenLi
Форумчанин
 
Регистрация: 02.06.2021
Сообщений: 515
По умолчанию

Цитата:
Сообщение от Kronos913 Посмотреть сообщение
Так чтобы сжатие применять только в случае перегруза, а иначе загружать все как обычно?
А вы уверены, что хватит памяти на сжатие в этом случае?

Цитата:
Сообщение от Kronos913 Посмотреть сообщение
Недавно в программу загрузил сразу 40 больших фотографий (5000х3000 примерно)
Они вам точно сразу нужны?
ForenLi вне форума Ответить с цитированием
Старый 01.02.2022, 14:57   #4
Kronos913
Форумчанин
 
Регистрация: 10.02.2021
Сообщений: 627
По умолчанию

Цитата:
Сообщение от ForenLi Посмотреть сообщение
Они вам точно сразу нужны?
Одна из функций программы - просмотреть все фото в папке
Kronos913 вне форума Ответить с цитированием
Старый 01.02.2022, 16:37   #5
Kronos913
Форумчанин
 
Регистрация: 10.02.2021
Сообщений: 627
По умолчанию

Цитата:
Сообщение от ForenLi Посмотреть сообщение
А вы уверены, что хватит памяти на сжатие в этом случае?
Я просто сделал вот такой вот код загрузки изображений:
Код:
Function ImageLoadMaxSize(const FileName:string; var Img:TImage; const MaxSize, NewSize:word): boolean;
var
  bmp1, bmp2: TBitMap;
begin
  bmp1:= TBitMap.Create;
  If BmpLoad(bmp1, FileName) then begin
    If (bmp1.Height>MaxSize) or (bmp1.Width>MaxSize) then begin
      bmp2:= TBitMap.Create;
      BitMapToSize(bmp1, bmp2, NewSize);
      Img.Picture.Assign(bmp2);
      bmp2.Free;
    end else Img.Picture.Assign(bmp1);
    Result:=true;
  end else result:= false;
  bmp1.Free;
end;
Использованные в коде самодельные процедуры:
BmpLoad - определяет расширение файла и загружает в BitMap JPEG, PNG, или BMP
BitMapToSizeXY - находит размеры для сжатого BitMap, так чтобы ни одна из сторон не превышала лимит
Код:
Procedure BitMapToSize(var BmpIn, BmpOut: TBitMap; const Size:Word);
var
  Rect: TRect;
  x, y: word;
begin
        BmpOut.Assign(nil);

        BitMapToSizeXY(BmpIn, Size, x, y);

        with Rect do begin
           Left := 0;
           Top := 0;
           Right := x;
           Bottom := y;
        end;

        BmpOut.Width:=x;
        BmpOut.Height:=y;

        BmpOut.Canvas.StretchDraw(Rect, BmpIn);
end;
С таким кодом перегруза памяти не происходит. Поставил ограничение в 1000х1000 по размеру, все что меньше - сжать

Последний раз редактировалось Kronos913; 01.02.2022 в 16:44.
Kronos913 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Проблемы с оперативной памятью. XmasLord Компьютерное железо 24 11.04.2015 00:38
Проблемы с памятью при умножении матриц (параллельно) Kr@ShAK Общие вопросы C/C++ 0 27.03.2015 22:22
Проблемы с памятью Firefly Общие вопросы .NET 11 21.03.2013 11:43
Проблемы с памятью в длинной арифметике Свитозар Помощь студентам 1 27.10.2012 18:29
Проблемы с виртуальной памятью. DeKot Операционные системы общие вопросы 13 29.05.2009 11:10