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

Общие вопросы программирования, алгоритмы и т.п.

Модератор: Модераторы

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

Сообщение shyub » 03.03.2016 18:39:15

При попытке загрузить 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 - там всё работает с любыми картинками. В чём может быть причина?
shyub
постоялец
 
Сообщения: 112
Зарегистрирован: 25.11.2014 23:15:19

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

Сообщение Mirage » 03.03.2016 23:06:01

Памяти не хватает.
Возможно, непрерывного куска такого не находится. Менеджер памяти слабоват?
Mirage
энтузиаст
 
Сообщения: 881
Зарегистрирован: 06.05.2005 20:29:07
Откуда: Russia

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

Сообщение sts » 03.03.2016 23:21:30

Оттрейсеруйте и сравните, подозреваю что в фпц 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;


написано на бум
sts
постоялец
 
Сообщения: 431
Зарегистрирован: 04.04.2008 12:15:44
Откуда: Тольятти

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

Сообщение shyub » 03.03.2016 23:46:01

Оттрейсеруйте и сравните, подозреваю что в фпц TBitmap создает Canvas с совместимый с железом (videocard) контекстом устройства (HDC) а там возможны ограничения размера типа 4096*4096*32bit

А где это искать?
shyub
постоялец
 
Сообщения: 112
Зарегистрирован: 25.11.2014 23:15:19

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

Сообщение sts » 03.03.2016 23:52:13

посмотрите 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 значит зависит от видюхи
sts
постоялец
 
Сообщения: 431
Зарегистрирован: 04.04.2008 12:15:44
Откуда: Тольятти

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

Сообщение shyub » 03.03.2016 23:57:39

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

Попробовал.
Первый раз дал ошибку, когда в PictureOpenDialog выделил BMP-файл размером 549MB, а окончательно слетел на
Код: Выделить всё
b.LoadFromFile(OpenPictureDialog1.FileName);
shyub
постоялец
 
Сообщения: 112
Зарегистрирован: 25.11.2014 23:15:19

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

Сообщение sts » 04.03.2016 00:02:03

в первый раз это потомуто в PictureOpenDialog превью есть

Добавлено спустя 1 минуту 31 секунду:
хм откуда в 1600 х 12000 - 549MB ?
sts
постоялец
 
Сообщения: 431
Зарегистрирован: 04.04.2008 12:15:44
Откуда: Тольятти

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

Сообщение vitaly_l » 04.03.2016 00:10:41

shyub писал(а):Попробовал

Попробуйте через Tstream, там Вы будете грузить файл в память а не в видеокарту.
И потом такого гиганта Вы всё равно на экран не выведите. Может имеет смысл сразу делать меньше размер?
Аватара пользователя
vitaly_l
долгожитель
 
Сообщения: 3333
Зарегистрирован: 31.01.2012 16:41:41

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

Сообщение shyub » 04.03.2016 00:11:43

Сделал вот так:
Код: Выделить всё
// Открыть файл
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
shyub
постоялец
 
Сообщения: 112
Зарегистрирован: 25.11.2014 23:15:19

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

Сообщение sts » 04.03.2016 00:14:37

хм, значит с этим нормально
sts
постоялец
 
Сообщения: 431
Зарегистрирован: 04.04.2008 12:15:44
Откуда: Тольятти

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

Сообщение shyub » 04.03.2016 00:18:00

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

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

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

Сообщение sts » 04.03.2016 00:43:04

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

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

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

Сообщение shyub » 04.03.2016 01:09:21

Код: Выделить всё
значит так, fpc 3 32bit bmp - 650mb грузится в TBitmap нормально
Скиньте, пожалуйсто, свой проект.
shyub
постоялец
 
Сообщения: 112
Зарегистрирован: 25.11.2014 23:15:19

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

Сообщение sts » 04.03.2016 01:13:02

уменьшил до 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 спасет отца русского программинга
Вложения
Clipboard01.jpg
sts
постоялец
 
Сообщения: 431
Зарегистрирован: 04.04.2008 12:15:44
Откуда: Тольятти

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

Сообщение vitaly_l » 04.03.2016 01:34:16

shyub писал(а):необходимо "закачать" в битовую матрицу без потерь всё изображение.


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



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

.
Аватара пользователя
vitaly_l
долгожитель
 
Сообщения: 3333
Зарегистрирован: 31.01.2012 16:41:41

След.

Вернуться в Общее

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 21

Рейтинг@Mail.ru