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

Имеет ли ограничения TImage на размер изображения

СообщениеДобавлено: 03.03.2016 18:39:15
shyub
При попытке загрузить BMP-файл размером 1600 х 12000 pix загрузка не происходит и появляются вот такие сообщения:
"Проект My вызвал класс исключения 'RunError(203)' по адресу 40FAE9", затем аналогичное сообщение с классом EOutQMemory.
Загружаю обычными функциями:
Код: Выделить всё
procedure TForm1.Menu1Click(Sender: TObject);
begin
  OpenPictureDialog1.Title:='Открыть существующий файл';
  if OpenPictureDialog1.Execute then
    Image1.Picture.LoadFromFile(OpenPictureDialog1.FileName);
end;

При загрузке изображения меньшего размера всё работает...
Этот же самый код переношу в Delphi - там всё работает с любыми картинками. В чём может быть причина?

Re: Имеет ли ограничения TImage на размер изображения

СообщениеДобавлено: 03.03.2016 23:06:01
Mirage
Памяти не хватает.
Возможно, непрерывного куска такого не находится. Менеджер памяти слабоват?

Re: Имеет ли ограничения TImage на размер изображения

СообщениеДобавлено: 03.03.2016 23:21:30
sts
Оттрейсеруйте и сравните, подозреваю что в фпц TBitmap создает Canvas с совместимый с железом (videocard) контекстом устройства (HDC) а там возможны ограничения размера типа 4096*4096*32bit

Добавлено спустя 7 минут 41 секунду:
попробуйте на левом сделать, и посмотреть где свалится

Код: Выделить всё
procedure TForm1.Menu1Click(Sender: TObject);
var
   b: TBitmap;

begin
  OpenPictureDialog1.Title:='Открыть существующий файл';
  if OpenPictureDialog1.Execute then begin
    b:= TBitmap.Create;
    try
      b.LoadFromFile(OpenPictureDialog1.FileName);
      Image1.Picture.Assign(b);
    finally
      b.Free;
    end;
  end;
end;


написано на бум

Re: Имеет ли ограничения TImage на размер изображения

СообщениеДобавлено: 03.03.2016 23:46:01
shyub
Оттрейсеруйте и сравните, подозреваю что в фпц TBitmap создает Canvas с совместимый с железом (videocard) контекстом устройства (HDC) а там возможны ограничения размера типа 4096*4096*32bit

А где это искать?

Re: Имеет ли ограничения TImage на размер изображения

СообщениеДобавлено: 03.03.2016 23:52:13
sts
посмотрите TBitmap.HandleType: TBitmapHandleType

Код: Выделить всё
TBitmapHandleType can be any of the following values:
Value Description
bmDIB  device-independent bitmap (DIB) 
bmDDB device-dependent bitmap (DDB) 


Добавлено спустя 3 минуты 38 секунд:
загрузте маленькую картинку в Image1.Picture.LoadFromFile(OpenPictureDialog1.FileName); под fpc
и посмотрите (Image1.Picture.Graphic as TBitmap).HandleType

Добавлено спустя 1 минуту 31 секунду:
если = bmDDB значит зависит от видюхи

Re: Имеет ли ограничения TImage на размер изображения

СообщениеДобавлено: 03.03.2016 23:57:39
shyub
попробуйте на левом сделать, и посмотреть где свалится

Попробовал.
Первый раз дал ошибку, когда в PictureOpenDialog выделил BMP-файл размером 549MB, а окончательно слетел на
Код: Выделить всё
b.LoadFromFile(OpenPictureDialog1.FileName);

Re: Имеет ли ограничения TImage на размер изображения

СообщениеДобавлено: 04.03.2016 00:02:03
sts
в первый раз это потомуто в PictureOpenDialog превью есть

Добавлено спустя 1 минуту 31 секунду:
хм откуда в 1600 х 12000 - 549MB ?

Re: Имеет ли ограничения TImage на размер изображения

СообщениеДобавлено: 04.03.2016 00:10:41
vitaly_l
shyub писал(а):Попробовал

Попробуйте через Tstream, там Вы будете грузить файл в память а не в видеокарту.
И потом такого гиганта Вы всё равно на экран не выведите. Может имеет смысл сразу делать меньше размер?

Re: Имеет ли ограничения TImage на размер изображения

СообщениеДобавлено: 04.03.2016 00:11:43
shyub
Сделал вот так:
Код: Выделить всё
// Открыть файл
procedure TForm1.Menu1Click(Sender: TObject);
var
   b: TBitmap;
a: TBitmapHandleType;
begin
  OpenPictureDialog1.Title:='Открыть существующий файл';
  if OpenPictureDialog1.Execute then begin
    b:= TBitmap.Create;
    try
      b.LoadFromFile(OpenPictureDialog1.FileName);
      Image1.Picture.Assign(b);
      a:=(Image1.Picture.Graphic as TBitmap).HandleType;
    finally
      b.Free;
    end;
  end;

a=BMDIB

Re: Имеет ли ограничения TImage на размер изображения

СообщениеДобавлено: 04.03.2016 00:14:37
sts
хм, значит с этим нормально

Re: Имеет ли ограничения TImage на размер изображения

СообщениеДобавлено: 04.03.2016 00:18:00
shyub
откуда в 1600 х 12000 - 549MB ?
Извиняюсь, опечатка. Следует читать: хм откуда в 16000 х 12000 - 549MB. Для эксперемента взял обычный BMP-файл и при помощи просмоторщика XnView растянул. Попробуйте, откроется ли у Вас файл такого размера.

Добавлено спустя 9 минут 41 секунду:
И потом такого гиганта Вы всё равно на экран не выведите. Может имеет смысл сразу делать меньше размер?
Согласен, не важно, что будет на экране, но для обработки необходимо "закачать" в битовую матрицу без потерь всё изображение.

Re: Имеет ли ограничения TImage на размер изображения

СообщениеДобавлено: 04.03.2016 00:43:04
sts
да под делфи 19000х12000 у меня работает, правда только в одном экземпляре, на вторую памяти нехватает :), ща лазарус помучаю

Добавлено спустя 22 минуты 15 секунд:
значит так, fpc 3 32bit bmp - 650mb грузится в TBitmap нормально, но!?!? прога жрет в два раза больше памяти чем должна - 1300мб и если ее попробовать отобразить в PaintBox то она пытается еще памяти отожрать и уже не хватает.

Re: Имеет ли ограничения TImage на размер изображения

СообщениеДобавлено: 04.03.2016 01:09:21
shyub
Код: Выделить всё
значит так, fpc 3 32bit bmp - 650mb грузится в TBitmap нормально
Скиньте, пожалуйсто, свой проект.

Re: Имеет ли ограничения TImage на размер изображения

СообщениеДобавлено: 04.03.2016 01:13:02
sts
уменьшил до 450mb - пролезла и рисуется но прога жрет в памяти ровно 3 * вес картинки

Добавлено спустя 1 минуту 14 секунд:
создал новый проект

кинул на форму
Button1: TButton;
PaintBox1: TPaintBox;

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

{$mode objfpc}{$H+}

interface

uses
  Classes, SysUtils, FileUtil, Forms, Controls, Graphics, Dialogs, StdCtrls,
  ExtCtrls;

type

  { TForm1 }

  TForm1 = class(TForm)
    Button1: TButton;
    PaintBox1: TPaintBox;
    procedure Button1Click(Sender: TObject);
    procedure FormCreate(Sender: TObject);
    procedure PaintBox1Paint(Sender: TObject);
  private
    { private declarations }
  public
    b: TBitmap;
    { public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.lfm}

{ TForm1 }

procedure TForm1.FormCreate(Sender: TObject);
begin
  b:= TBitmap.Create;

end;

procedure TForm1.PaintBox1Paint(Sender: TObject);
begin
  PaintBox1.Canvas.Draw(0,0, b);
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
  b.LoadFromFile('d:FinalFantasyXIII6.bmp');

end;

end.


Добавлено спустя 9 минут 17 секунд:
в делфе все нормально

Добавлено спустя 3 минуты 3 секунды:
подозреваю что 64bit спасет отца русского программинга

Re: Имеет ли ограничения TImage на размер изображения

СообщениеДобавлено: 04.03.2016 01:34:16
vitaly_l
shyub писал(а):необходимо "закачать" в битовую матрицу без потерь всё изображение.


Код: Выделить всё
var
  Stream: TStream;
...
  if OpenDialog1.Execute then
     Stream := TFileStream.Create(OpenDialog1.FileName, fmOpenRead);   



Так загрузит файл?

.