Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

компонент TImage при больших размерах [D7]


Страницы:   1 2

SvetaZ ©   (2015-02-18 13:58:00) 

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


sniknik   (2015-02-23 15:41:00) [1]

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


SvetaZ   (2015-02-23 08:59:00) [2]


> 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;


Andy BitOff   (2015-02-21 15:37:00) [3]

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


Andy BitOff   (2015-02-21 14:47:00) [4]


 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;


SvetaZ   (2015-02-20 13:29:00) [5]


> 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');

Ну да и ладно.


han_malign   (2015-02-20 11:37:00) [6]


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

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


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

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


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

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


SvetaZ   (2015-02-20 07:59:00) [8]

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

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


han_malign   (2015-02-19 12:53:00) [9]


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

- это означает что у системы/сеанса выжран весь подгружаемый пул
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)


sniknik   (2015-02-18 18:20:00) [10]

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

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


icWasya   (2015-02-18 17:54:00) [11]

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


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

Image1.Picture.Bitmap := BitmapWithPhoto;


sniknik   (2015-02-18 16:41:00) [13]

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

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


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

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

работает.


sniknik   (2015-02-18 16:24:00) [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
---------------------------
Окно не имеет полос прокрутки.
---------------------------
ОК  
---------------------------


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


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

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


sniknik   (2015-02-18 16:12:00) [17]

> 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:01:00) [18]


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


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

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

LoadFromFile - не нужно.


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

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


sniknik   (2015-02-18 15:30:00) [20]

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

ты обещал. ;(


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо