Страница 1 из 2
Имеет ли ограничения TImage на размер изображения
Добавлено: 03.03.2016 17: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 22:06:01
Mirage
Памяти не хватает.
Возможно, непрерывного куска такого не находится. Менеджер памяти слабоват?
Re: Имеет ли ограничения TImage на размер изображения
Добавлено: 03.03.2016 22:29:11
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 22:46:01
shyub
Оттрейсеруйте и сравните, подозреваю что в фпц TBitmap создает Canvas с совместимый с железом (videocard) контекстом устройства (HDC) а там возможны ограничения размера типа 4096*4096*32bit
А где это искать?
Re: Имеет ли ограничения TImage на размер изображения
Добавлено: 03.03.2016 22:57:22
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 22:57:39
shyub
попробуйте на левом сделать, и посмотреть где свалится
Попробовал.
Первый раз дал ошибку, когда в PictureOpenDialog выделил BMP-файл размером 549MB, а окончательно слетел на
Код: Выделить всё
b.LoadFromFile(OpenPictureDialog1.FileName);
Re: Имеет ли ограничения TImage на размер изображения
Добавлено: 03.03.2016 23:03:34
sts
в первый раз это потомуто в PictureOpenDialog превью есть
Добавлено спустя 1 минуту 31 секунду:
хм откуда в 1600 х 12000 - 549MB ?
Re: Имеет ли ограничения TImage на размер изображения
Добавлено: 03.03.2016 23:10:41
vitaly_l
shyub писал(а):Попробовал
Попробуйте через Tstream, там Вы будете грузить файл в память а не в видеокарту.
И потом такого гиганта Вы всё равно на экран не выведите. Может имеет смысл сразу делать меньше размер?
Re: Имеет ли ограничения TImage на размер изображения
Добавлено: 03.03.2016 23: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 на размер изображения
Добавлено: 03.03.2016 23:14:37
sts
хм, значит с этим нормально
Re: Имеет ли ограничения TImage на размер изображения
Добавлено: 03.03.2016 23:27:41
shyub
откуда в 1600 х 12000 - 549MB ?
Извиняюсь, опечатка. Следует читать: хм откуда в 16000 х 12000 - 549MB. Для эксперемента взял обычный BMP-файл и при помощи просмоторщика XnView растянул. Попробуйте, откроется ли у Вас файл такого размера.
Добавлено спустя 9 минут 41 секунду:И потом такого гиганта Вы всё равно на экран не выведите. Может имеет смысл сразу делать меньше размер?
Согласен, не важно, что будет на экране, но для обработки необходимо "закачать" в битовую матрицу без потерь всё изображение.
Re: Имеет ли ограничения TImage на размер изображения
Добавлено: 04.03.2016 00:05:19
sts
да под делфи 19000х12000 у меня работает, правда только в одном экземпляре, на вторую памяти нехватает

, ща лазарус помучаю
Добавлено спустя 22 минуты 15 секунд:значит так, fpc 3 32bit bmp - 650mb грузится в TBitmap нормально, но!?!? прога жрет в два раза больше памяти чем должна - 1300мб и если ее попробовать отобразить в PaintBox то она пытается еще памяти отожрать и уже не хватает.
Re: Имеет ли ограничения TImage на размер изображения
Добавлено: 04.03.2016 00:09:21
shyub
Код: Выделить всё
значит так, fpc 3 32bit bmp - 650mb грузится в TBitmap нормально
Скиньте, пожалуйсто, свой проект.
Re: Имеет ли ограничения TImage на размер изображения
Добавлено: 04.03.2016 00:26:36
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 00:34:16
vitaly_l
shyub писал(а):необходимо "закачать" в битовую матрицу без потерь всё изображение.
Код: Выделить всё
var
Stream: TStream;
...
if OpenDialog1.Execute then
Stream := TFileStream.Create(OpenDialog1.FileName, fmOpenRead);
Так загрузит файл?
.