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

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

Как изменить размер bitmap в памяти? [D7, WinXP]


Страницы:   1 2

Dr. Andrew ©   (2007-08-29 17:58:00) 

Добрый день, Мастера!
В процедуре onCtreate создал Bitmap:

procedure TForm1.onCtreate(Sender : TObject);
begin
 bitmap := Tbitmap.Create;
 bitmap.Pixelformat := pf24bit;
 bitmap.Height := 200;
 bitmap.Width := 300;
 потом стандартными методами загружаю в него картинку.
end;

A процедуре onResize мне необходимо изменить размеры Bitmap:

procedure TForm1.onResize(Sender : TObject);
begin
  if bitmap <> nil then
    bitmap.Free;
  bitmap := Tbitmap.Create;
  bitmap.Pixelformat := pf24bit;
  bitmap.Height := 2000;
  bitmap.Width := 3000;
  потом стандартными методами загружаю в него туже картинку.
end;

При этом данный процесс "съедает" уйму памяти.  можно просто изменить параметры ширины и высоты Bitmap в TBitmapInfo непосредстенно в памяти, чтобы не создавать новый bitmap с новыми шириной и высотой. Как связать bitmap и память (TBitmapInfo)? Пожалуйста, если можно, небольшой практический пример как это можно реализовать. Всем спасибо!


Dr. Andrew   (2007-08-29 18:48:00) [21]

да бог сним с этим bitmap.LoadfromFile. Выаводим просто люой рисунок, напрмиер методом Scanline. а далее необходимо растянуть битмар на весь экран, но оставить прорисовку с использованием метода Scanline, например, а не применяя процедуру StretchDraw. Вот вопрос в чем. Как изменить размеры битмапа без создания нового с размерами экрана, потому что в данном случае он съедает кучу памяти. Спасибо.


{RASkov}   (2007-08-29 18:43:00) [22]

Посмотри вот это:
unit Unit1;
interface
uses
 Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
 Dialogs;

type
 TForm1 = class(TForm)
   procedure FormCreate(Sender: TObject);
   procedure FormResize(Sender: TObject);
   procedure FormPaint(Sender: TObject);
   procedure FormClose(Sender: TObject; var Action: TCloseAction);
 private
   { Private declarations }
 public
   BmpOrig, BmpTmp: TBitmap;
   { Public declarations }
 end;

var
 Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.FormCreate(Sender: TObject);
begin
 BmpOrig:=TBitMap.Create;
 BmpOrig.LoadFromFile('D:\My Folder\Img_001.bmp');
end;

procedure TForm1.FormResize(Sender: TObject);
begin
 try
  if not Assigned(BmpTmp) then BmpTmp:=TBitMap.Create;
  BmpTmp.Width:=Width div 2;
  BmpTmp.Height:=Height div 2;
  BmpTmp.Canvas.StretchDraw(BmpTmp.Canvas.ClipRect, BmpOrig);
  Invalidate;
 except
  if Assigned(BmpTmp) then FreeAndNil(BmpTmp);
 end;
end;

procedure TForm1.FormPaint(Sender: TObject);
begin
 Canvas.Draw(10, 10, BmpTmp);
end;

procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
 if Assigned(BmpTmp) then FreeAndNil(BmpTmp);
 if Assigned(BmpOrig) then FreeAndNil(BmpOrig);
end;

end.
И опять...

> procedure TForm1.onCtreate(Sender : TObject);
> begin
> bitmap := Tbitmap.Create;

> bitmap.Pixelformat := pf24bit;
> bitmap.Height := 200;
> bitmap.Width := 300;
Это все рухнет после:
> bitmap.LoadfromFile(D:/My Folder/Img_001.bmp);
> Canvas.Draw(0,0, bitmap);
> end;


Dr. Andrew   (2007-08-29 18:35:00) [23]

хорошо пусть я просто рисую на нем линии квадраты и так далее, а затем нужно увеличит размер это битмапа с наименьгей загрузкой памяти


Dr. Andrew   (2007-08-29 18:34:00) [24]

procedure TForm1.onCtreate(Sender : TObject);
begin
bitmap := Tbitmap.Create;
bitmap.Pixelformat := pf24bit;
bitmap.Height := 200;
bitmap.Width := 300;
bitmap.LoadfromFile(D:/My Folder/Img_001.bmp);
Canvas.Draw(0,0, bitmap);
end;

Далее я разворачиваю окно на весь экран, а в процедуре onResize мне необходимо изменить размеры Bitmap (применение процедуры скреч исключено!). Мне нужен битмар с большими размерами (размерами экрана):

procedure TForm1.onResize(Sender : TObject);
begin
 if bitmap <> nil then
   bitmap.Free;
 bitmap := Tbitmap.Create;
 bitmap.Pixelformat := pf24bit;
 bitmap.Height := 2000;
 bitmap.Width := 3000;
 потом стандартными методами загружаю в него туже картинку.
end;


{RASkov}   (2007-08-29 18:31:00) [25]

> потом стандартными методами загружаю в него туже картинку.

Стандартным - это каким? LoadFromFile?
Если Да - то все эти установки размеров и прочего к чертям собачьим....
Нет смысла настраивать Битмап перед загрузкой его из файла...


{RASkov}   (2007-08-29 18:25:00) [26]

> [0] Dr. Andrew   (29.08.07 17:58)

А где этот битмап потом используется?
И смысл на OnResize делать так:
 bitmap.Height := 2000;
 bitmap.Width := 3000;
???

> можно просто изменить параметры ширины и высоты Bitmap в
> TBitmapInfo непосредстенно в памяти, чтобы не создавать
> новый bitmap с новыми шириной и высотой.

Ну так и меняй BMP.Width:=NewWidth.... без создания его заного..

А лучше задачу "нарисуй" поподробнее....


Страницы:   1 2

Наверх

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