Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 2017.01.15;
Скачать: [xml.tar.bz2];

Вниз

компонент TImage при больших размерах   Найти похожие ветки 

 
SvetaZ ©   (2015-02-18 13:58) [0]

Здравствуйте. При размере TImage = 3000x3000 вылетает ошибка:
"Недостаточно памяти для обработки команды." Это в Delphi7. Как это можно побороть? Или может следует перейти на более новую версия Delphi?


 
MBo ©   (2015-02-18 14:42) [1]

1. Такой TImage содержит картинку (битмап) размером 36 мегабайт, а место в системе под картинки ограничено.

2. Такой размер TImage не нужен.
Нужно подумать, как решить реальную задачу. Для этого хорошо бы узнать её суть.


 
SvetaZ ©   (2015-02-18 14:48) [2]


> Для этого хорошо бы узнать её суть.

Ну для примера хотя бы залить фото 2448х3264


 
sniknik ©   (2015-02-18 15:12) [3]

странно, а у меня легко открыло... в d7
вот эту переконвертил в bmp
http://www.artfile.ru/i.php?i=636376
открыл  Image1.Picture.LoadFromFile("C:\Data\Test.bmp")


 
MBo ©   (2015-02-18 15:15) [4]

>хотя бы залить фото 2448х3264
Уменьшить его до нужного размера - ведь мало у кого есть мониторы с таким разрешением. Если нужно показывать кусок 1:1 - вырезать кусок, который помещается, и отобразить.


 
SvetaZ ©   (2015-02-18 15:16) [5]

не через LoadFromFile, а из BitMap CopyRect


 
sniknik ©   (2015-02-18 15:16) [6]

> следует перейти на более новую версия Delphi?
если только для написания программ под 64-бита если уж в память "упор". там больше выделяется.

> Ну для примера хотя бы залить фото 2448х3264
ну "заливать" можно файлом, открывать в TImage не обязательно.


 
sniknik ©   (2015-02-18 15:17) [7]

> не через LoadFromFile, а из BitMap CopyRect
аааааа... так это у вас ошибка в программе. а причем тут память?


 
SvetaZ ©   (2015-02-18 15:23) [8]


> MBo ©   (18.02.15 15:15) [4]

Эти куски все равно будут хранится в память, так тогда какая разница, если мы займем одинаковый объем памяти. Просто получается TImage не правильно работает.


 
SvetaZ ©   (2015-02-18 15:25) [9]


> так это у вас ошибка в программе. а причем тут память?

Да не ошибки, можно просто создать такого размера TImage, ну и попробовать вывести хотя бы просто текст и будет такая ошибка.


 
sniknik ©   (2015-02-18 15:30) [10]

> ну и попробовать вывести хотя бы просто текст и будет такая ошибка.
 Image1.Picture.LoadFromFile("C:\Data\Test.bmp");
 Image1.Canvas.TextOut(10, 10, "просто текст");
нету... ????

ты обещал. ;(


 
backuper   (2015-02-18 15:46) [11]

там в TImage случаем jpeg не загружен?..


 
SvetaZ ©   (2015-02-18 16:01) [12]


> sniknik ©   (18.02.15 15:30) [10]


Image1.width := 3000;
Image1.height := 3000;

Image1.canvas.textout(10,10,"asdasd");

LoadFromFile - не нужно.


 
sniknik ©   (2015-02-18 16:12) [13]

> Image1.width := 3000;
> Image1.height := 3000;

> Image1.canvas.textout(10,10,"asdasd");
и опять таки ошибки нет, хотя и не выводит ничего... вот так выводит
 Image1.Width := 3000;
 Image1.Height:= 3000;
 Image1.Picture.Bitmap.Width:= 3000;
 Image1.Picture.Bitmap.Height:= 3000;

 Image1.Canvas.TextOut(100, 100, "asdasd");


 
SvetaZ ©   (2015-02-18 16:21) [14]


> > Image1.width := 3000;
> > Image1.height := 3000;

ну это наверное от свободной памяти зависит, попробуйте больше.


 
sniknik ©   (2015-02-18 16:24) [15]

больше -
const
 xy = 23170;
begin
 Image1.Width := xy;
 Image1.Height:= xy;
 Image1.Picture.Bitmap.Width := xy;
 Image1.Picture.Bitmap.Height:= xy;

 Image1.Canvas.TextOut(100, 100, "asdasd");
end;


а 23171 дает ошибку -
---------------------------
Project1
---------------------------
Окно не имеет полос прокрутки.
---------------------------
ОК  
---------------------------


 
sniknik ©   (2015-02-18 16:30) [16]

> Окно не имеет полос прокрутки.
что наводит на мысль...
const
 xy = 223170;
begin
 PaintBox1.Width := xy;
 PaintBox1.Height:= xy;
 PaintBox1.Canvas.TextOut(100, 100, "asdasd");
end;

работает.


 
sniknik ©   (2015-02-18 16:41) [17]

кстати прикольно, у паинта нет ошибок до максимума -
const
 xy = MaxInt;

но отключаются полосы прокрутки (их просто не видно), обе, при  xy = MaxInt - 8; восстанавливается вертикальная, а xy = MaxInt - 16; и горизонтальная, проблем нет в общем.


 
invis ©   (2015-02-18 16:52) [18]

Image1.Picture.Bitmap := BitmapWithPhoto;


 
icWasya ©   (2015-02-18 17:54) [19]

Ткт фишка такая. Внутри TImage по умолчанию сидит TBitmap, корорый, опять же по умолчанию создаётся в режиме PixelFormat = pfDevice. И в этом случае максимально возможный размер зависит от текущего режима графического адаптера.


 
sniknik ©   (2015-02-18 18:20) [20]

> возможный размер зависит от текущего режима графического адаптера.
т.е. у автора поста "проблема" памяти в железе? и если в начале, перед изменениями размеров, поставить например
Image1.Picture.Bitmap.PixelFormat:= pf24bit;
то ошибки не будет?

подтверждается проверкой на xy = 23171; которая у меня не работала до смены PixelFormat, а c pf24bit работает, и даже чуть с большим размером... (а совсем большой уже не про прокрутку ошибку дает, а именно про память)


 
han_malign ©   (2015-02-19 12:53) [21]


> т.е. у автора поста "проблема" памяти в железе?

- это означает что у системы/сеанса выжран весь подгружаемый пул
http://blogs.technet.com/b/mark_russinovich/archive/2010/04/06/3323382.aspx

при работе с большими растрами нужно использовать DIB-секцию(размещенную в памяти приложения), а никак не DDB(https://msdn.microsoft.com/en-us/liBRary/dd183561%28v=vs.85%29.aspx)


 
SvetaZ ©   (2015-02-20 07:59) [22]

DIB  - секция используется при смене  PixelFormat?

Почему тогда не выводится текст?
 Image1.Picture.Bitmap.PixelFormat := pf24bit;
 Image1.Canvas.TextOut(10,10,"Привет");


 
sniknik ©   (2015-02-20 11:00) [23]

> Почему тогда не выводится текст?
у меня выводится, т.что это наверное тоже зависит от железа, попробуй другие.
TPixelFormat = (pfDevice, pf1bit, pf4bit, pf8bit, pf15bit, pf16bit, pf24bit, pf32bit, pfCustom);


 
han_malign ©   (2015-02-20 11:37) [24]


> DIB  - секция используется при смене  PixelFormat?

Image1.Picture.Bitmap.PixelFormat <> pfDevice
  либо явно
Image1.Picture.Bitmap.HandleType:= bmDIB;


> Почему тогда не выводится текст?

- Stretch? AutoSize??? полосы прокрутки у тебя есть?
может ты просто "не видишь сурка"(с)?


 
SvetaZ ©   (2015-02-20 13:29) [25]


> sniknik ©   (20.02.15 11:00) [23]
>
> > Почему тогда не выводится текст?
> у меня выводится, т.что это наверное тоже зависит от железа,
>  попробуй другие.
> TPixelFormat = (pfDevice, pf1bit, pf4bit, pf8bit, pf15bit,
>  pf16bit, pf24bit, pf32bit, pfCustom);


не работает, где-то в док. написано, что после загрузки изображения тоже должна использоваться DIB-секция. И тоже самое ничего не выводится:

Image1.Picture.LoadFromFile("test.bmp");
Image1.Canvas.TextOut(100,100,"dddddd");

Ну да и ладно.


 
Andy BitOff ©   (2015-02-21 14:47) [26]


 TmyClass = class(TGraphicControl)
 private
   m_theBitmap: TBitmap;
 protected
   procedure Paint; override;
 public
   constructor Create(AOwner: TComponent); override;
   destructor Destroy; override;
 end;

 TForm1 = class(TForm)
   ScrollBox1: TScrollBox;
   procedure FormCreate(Sender: TObject);
 private
   { Private declarations }
   m_theMy: TmyClass;
 public
   { Public declarations }
 end;

constructor TmyClass.Create(AOwner: TComponent);
begin
 inherited;
 m_theBitmap := TBitmap.Create;
 m_theBitmap.LoadFromFile("test1.bmp");
 m_theBitmap.Canvas.Font.Assign(Font);
 Width := m_theBitmap.Width;
 Height := m_theBitmap.Height;
end;

destructor TmyClass.Destroy;
begin
 inherited;
 m_theBitmap.Free;
end;

procedure TmyClass.Paint;
var
 aRect: Trect;
begin
 m_theBitmap.Canvas.TextOut(100, 100, "dddddd");
 GetClipBox(Canvas.Handle, aRect);
 bitblt(Canvas.Handle, aRect.Left, aRect.Top, aRect.Right - aRect.Left, aRect.Bottom - aRect.Top,
     m_theBitmap.Canvas.Handle, aRect.Left, aRect.Top, SRCCOPY);
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
 m_theMy := TmyClass.Create(Self);
 m_theMy.Parent := ScrollBox1;
end;


 
Andy BitOff ©   (2015-02-21 15:37) [27]

Тестил на битмапе размером 20000х18000 - норм. Единстаенное, что битмап долго грузится.


 
SvetaZ ©   (2015-02-23 08:59) [28]


> Andy BitOff ©   (21.02.15 14:47) [26]

Но тут отрисовка идет в OnPaint

Так и не поняла почему так происходит:

1) Отображается только в OnPaint

procedure TForm1.Button1Click(Sender: TObject);
var
 aRect: TRect;
begin
 Image1.Picture.Bitmap.PixelFormat := pf1bit;
 Image1.Canvas.TextOut(10,10,"Привет");

end;


procedure TForm1.FormPaint(Sender: TObject);
begin
 bitblt(Canvas.Handle, 0, 0, 100, 100,Image1.Canvas.Handle, 0, 0, SRCCOPY);
end;


2) Отображается без OnPaint, но тогда не используем DIB-секцию


> procedure TForm1.Button1Click(Sender: TObject);
> var
>   aRect: TRect;
> begin
>   //Image1.Picture.Bitmap.PixelFormat := pf1bit;
>   Image1.Canvas.TextOut(10,10,"Привет");
> end;


3) Так не отображается


> procedure TForm1.Button1Click(Sender: TObject);
> var
>   aRect: TRect;
> begin
>   Image1.Picture.Bitmap.PixelFormat := pf1bit;
>   Image1.Canvas.TextOut(10,10,"Привет");
>   bitblt(Canvas.Handle, 0, 0, 100, 100,Image1.Canvas.Handle,
>  0, 0, SRCCOPY);
> end;


 
sniknik ©   (2015-02-23 15:41) [29]

> 3) Так не отображается
копируешь черно белый без полутонов рисунок? pf1bit это 1 битовая маска, т.е. 0 vs 1 значения, другое скорее всего не примет, авто преобразования с корекцией цвета в стандартном компоненте скорее всего нет.



Страницы: 1 вся ветка

Форум: "Начинающим";
Текущий архив: 2017.01.15;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.52 MB
Время: 0.045 c
2-1429615713
dmk
2015-04-21 14:28
2017.01.15
Отрисовка контрола при перемещении


1-1343890489
rioko
2012-08-02 10:54
2017.01.15
Stream.Seek Stream.Position возвращает ноль.


2-1426067911
aka
2015-03-11 12:58
2017.01.15
TObject через ссылку


3-1308531630
Дмитрий С
2011-06-20 05:00
2017.01.15
Mysql, большой blob. как лучше?


1-1340607264
viosvi
2012-06-25 10:54
2017.01.15
ориентация листа OpenOffice





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский