Modificarea dimensiunii bitmap în memorie

Cum de a schimba dimensiunea bitmap în memorie?

Și este mai bine să desenați o sarcină mai detaliată.

> Apoi, prin metode standard, încarc aceeași imagine în ea.

Standard - așa este? LoadFromFile?






Dacă da - atunci toate aceste dimensiuni setări și alte lucruri în iad cu câinele.
Nu are sens să configurați bitmap-ul înainte de al descărca din fișier.

procedura TForm1.onCtreate (expeditor TObject);
începe
bitmap: = Tbitmap.Create;
bitmap.Pixelformat: = pf24bit;
bitmap.Height: = 200;
bitmap.Width: = 300;
bitmap.LoadfromFile (D: / Folderul meu / Img_001.bmp);
Canvas.Draw (0,0, bitmap);
se încheie;

Apoi, extind fereastra pe ecran complet, iar în procedura onResize, trebuie să redimensionez Bitmap-ul (aplicarea procedurii este eliminată!). Am nevoie de un bitmap cu dimensiuni mari (dimensiuni ecran):

bine, lasă-mă să trag linii pe pătrate și așa mai departe, și apoi trebuie să măresc dimensiunea acestui bitmap cu cea mai mică încărcare de memorie

Uitați-vă la acest lucru:
unitate 1;
interfață
utilizări
# xA0; Windows, Mesaje, SysUtils, Variante, Clase, Grafică, Controale, Formulare,
# xA0; Dialoguri;

tip
# xA0; TForm1 = clasa (TForm)
# xA0; # xA0; procedura FormCreate (expeditor: TObject);
# xA0; # xA0; procedura FormResize (Expeditor: TObject);
# xA0; # xA0; procedura FormPaint (expeditor: TObject);
# xA0; #XA0; procedura FormClose (expeditor: TObject; var Action: TCloseAction);
# xA0; privat
# xA0; # xA0;
# xA0; public
# xA0; # xA0; BmpOrig; BmpTmp: TBitmap;
# xA0; # xA0;
# xA0; sfârșitul;

var
# xA0; Form1: TForm1;

procedura TForm1.FormCreate (expeditor: TObject);
începe
# xA0; BmpOrig: = TBitMap.Create;
# xA0; BmpOrig.LoadFromFile ("D: \ Folderul meu \ Img_001.bmp");
se încheie;

procedura TForm1.FormResize (expeditor: TObject);
începe
# xA0; încercați
# xA0; dacă nu este Atribuit (BmpTmp) apoi BmpTmp: = TBitMap.Create;
# xA0; BmpTmp.Width: = Lățimea div 2;
# xA0; BmpTmp.Height: = Înălțime div 2;
# xA0; BmpTmp.Canvas.StretchDraw (BmpTmp.Canvas.ClipRect, BmpOrig);
# xA0; Invalidați;
# xA0; cu excepția
# xA0; dacă este atribuit (BmpTmp) apoi FreeAndNil (BmpTmp);
# xA0; sfârșitul;
se încheie;

procedura TForm1.FormPaint (expeditor: TObject);
începe
# xA0; Canvas.Draw (10, 10, BmpTmp);
se încheie;

procedura TForm1.FormClose (expeditor: TObject; var Action: TCloseAction);
începe
# xA0; dacă este atribuită (BmpTmp) apoi FreeAndNil (BmpTmp);
# xA0; dacă este atribuită (BmpOrig) apoi FreeAndNil (BmpOrig);
se încheie;

end.
Și din nou.

> procedura TForm1.onCtreate (expeditor TObject);
> începe
> bitmap: = Tbitmap.Create;

> bitmap.Pixelformat: = pf24bit;
> bitmap.Height: = 200;
> bitmap.Width: = 300;
Toate acestea se vor prăbuși după:
> bitmap.LoadfromFile (D: / Folderul meu / Img_001.bmp);
> Canvas.Draw (0,0, bitmap);
> sfârșit;

Da, Dumnezeu a împușcat cu acest bitmap.LoadfromFile. Se deduce pur și simplu figură lyuyu, metoda Scanlon. și apoi trebuie să întindeți bitmap-ul pe ecran complet, dar lăsați desenul folosind metoda Scanline, de exemplu, și nu utilizați procedura StretchDraw. Asta e problema. Cum de a modifica dimensiunea unui bitmap fără a crea un nou cu dimensiunile ecranului, pentru că în acest caz mâncă o grămadă de memorie. Mulțumesc.

> [6] Andrew # xA0; (Aug 29, 07 18:48)
> Asta e problema. Modificarea dimensiunii unui bitmap fără a crea
> Nou cu dimensiuni de ecran,

Ei bine, nu știu. Ți-am dat un exemplu de modificare a mărimii fără să o creezi.
Aici în loc de BmpTmp.Canvas.StretchDraw (BmpTmp.Canvas.ClipRect, BmpOrig);
scrieți metoda pe baza Scanline și asta este.

Și el mănâncă de la tine pentru că îl creezi pe fiecare strănut în OnResize, dar nu-l distrugi.
Ie aceasta este

> dacă bitmap <> nil atunci
> # xA0; bitmap.Free;

nu lucrați și este creat un nou bitmap, cel vechi (adică memoria ocupată pentru acesta) nu este lansat.

> Un om mănâncă de la tine pentru că îl ai pe strănut în OnResize
> Crezi, dar nu distruge.
> De exemplu. aceasta este
>
>> dacă bitmap <> nil atunci
>> # xA0; bitmap.Free;
>
> nu lucrați și creați un bitmap nou, vechiul (de ex.
> memorie ocupată sub ea) nu este eliberată.

Ie bit greșit, dar punctul este faptul că

> bitmap.Free;

aceasta va funcționa o dată și totul, deoarece variabila bitmap nu se anulează. și apoi pur și simplu. se încheie [7]

Scuze. Chiar și la sfârșitul lui [7] și [8] deja m-am încurcat. acum îmi dau seama. Voi scrie :)

modificările la distrugerea bitmap-ului nu oferă nimic







Cu toate acestea. Aici este:

var bitmap. Tbitmap; // variabilă globală.

procedura TForm1.onCtreate (expeditor TObject);
începe
# xA0; bitmap: = Tbitmap.Create;
# xA0; bitmap.LoadfromFile (D: / Folderul meu / Img_001.bmp);
se încheie;

procedura TForm1.onResize (expeditor TObject);
începe
# xA0; dacă bitmap <> nil apoi bitmap.Free;
# xA0; bitmap: = Tbitmap.Create;
# xA0; bitmap.LoadfromFile (D: / Folderul meu / Img_001.bmp);
se încheie;

Nu ar trebui să existe scurgeri, frâne - da. Uită-te în altă parte pentru scurgeri.
Dar acest cod nu este "corect". Vedeți exemplul din [5] că nu există creație / ștergere multiple.

> [10] Andrew # xA0; (08/29/2007 20:00)

?

Raskov. Mulțumesc, dar nu este vorba despre LoadfromFile. Da, Dumnezeule, uită-te. Trebuie să redimensionez bitmap-ul pentru a salva memoria. Aceasta este întrebarea corectă, nu polkemika despre procedura de încărcare a unui fișier.

> [12] Andrew # xA0; (Aug 29, 07 20:30)

Da, nu vorbesc despre LoadfromFile :) E acolo. de exemplu, în subiect.

procedura TForm1.FormPaint (expeditor: TObject);
începe
Canvas.StretchDraw (ClientRect, OrgBMP);
se încheie;

procedura TForm1.FormCreate (expeditor: TObject);
începe
DoubleBuffered: = Adevărat;
OrgBMP: = TBitmap.Create;
OrgBMP.LoadFromFile ("c: \ pp.bmp");
se încheie;

procedura TForm1.FormDestroy (expeditor: TObject);
începe
OrgBMP.Free
se încheie;

procedura TForm1.FormResize (expeditor: TObject);
începe
vopsi;
se încheie;

Nu vă place StretchDraw, creați un bitmap, faceți metoda de evaziune. Memorie, desigur, va fi beatmap.
Este posibil prin SetPixel, canvas.Pixels cu toate frânările rezultate.

RASkov - metoda SetWidth (Înălțime) a TBitmap - ce este? și unde există bitmap-urile cu astfel de metode?
Pavia - nu este vorba despre încărcare sau descărcare, ci despre redimensionarea oricărui bitmap cu utilizarea memoriei economice.


> [15] Andrew # xA0; (Aug 29, 07 20:53)
> metoda SetWidth (Înălțime) a TBitmap - ce este?

Aceasta este atunci când atribuiți o nouă valoare proprietății Width (Heigth), apoi metodele sale protejate sunt executate.

Principiul. Da, nu este nevoie de un al doilea bitmap. acest lucru sunt chiar obosit cu dimensiunea :). unul [14] este suficient, în care să încărcați imaginea originală la început și să scalați (ieșiți) pe cât vă place la panza. și nu trebuie să schimbați nici o dimensiune.

O nafiga de fiecare dată pentru a crea, a șterge. Odată creat și redimensionat.

var
bmp, tmp: TBitmap;
NewWidth, NewHeight: Integer;
începe
NewWidth: = 1000;
NewHeight: = 1000;

orgbmp.Assign (bmp); - nu este necesar
Doar lucrez cu bmp

> Dr. Andrew
Puteți explica în detaliu ce aveți nevoie de ceva. )

Scrieți o nouă valoare în TBitmapInfoHeader.biWidth și nu se fură. - a observat corect. Dar dacă, fără ironie, ceva poate fi inventat în acest plan?

> [21] Andrew # xA0; (Aug 29, 07 21:46)
> Dar dacă, fără ironie, ceva poate fi inventat în acest plan?

Poți. Doar am venit deja cu - TBitmap
:)
Cu toate acestea, dacă descrieți în detaliu ce și ce aveți nevoie, atunci poate veți răspunde.
Sunt specific în această problemă. Nu te pot ajuta.


> Dar dacă, fără ironie, ceva poate fi inventat în acest plan?

Vrei să construiești o cărămidă fără cărămizi?

Ți-am scris. Asigurați-vă modul dvs. de citire / scriere bmp. Și citiți parțial.

Aici există un cod pentru crearea unui bitmap, deși nu există suficiente cunoștințe pentru ao adăuga:

TMBitmap = clasă
# xA0; privat
# xA0; # xA0;
# xA0; # xA0; # xA0; FLineSize: Integer;
# xA0; # xA0; # xA0; BM. THandle;
# xA0; # xA0; # xA0; Procedura Allocate (SX, SY: integer);
# xA0; public
# xA0; # xA0;
# xA0; # xA0; proprietatea mânerului. Thandle a citit BM;

# xA0; # xA0; Constructor Creare (Lățime, Înălțime, Integer);
# xA0; # xA0; distrugătorul distrugător; suprascrie;

# xA0; # xA0; procedura LoadFromFile (const FileName: string);
# xA0; sfârșitul;

tip
# xA0; TarrRGBTriple = array [octet] din TRGBTriple;
# xA0; ParrRGBTriple = ^ TarrRGBTriple;

constructor TMBitmap.Create (Lățime, Înălțime, Integer);
începe
# xA0; a creat moștenirea;
# xA0; Alocați (Lățime, Înălțime);
se încheie;

destructor TMBitmap.Destroy;
începe
# xA0; moștenit;
se încheie;


procedura TMBitmap.Allocate (SX, SY: integer);
Var DC: HDC;
# xA0; # xA0; PB: Pointer;
# xA0; # xA0; BI: tagBITMAPINFO;
începe
# xA0; dacă BM<>0 apoi DeleteObject (BM);
# xA0; BM: = 0; # xA0; PB: = nul;
# xA0; fillchar (BI, dimensiunea (BI), 0);
# xA0; cu BI.bmiHeader face
# xA0; începeți
# xA0; # xA0; biSize: = dimensiunea (BI.bmiHeader);
# xA0; # xA0; biWidth: = SX;
# xA0; # xA0; biHeight: = SY;
# xA0; # xA0; biPlanes: = 1;
# xA0; # xA0; biBitCount: = 24;
# xA0; # xA0; biCompression: = BI_RGB;
# xA0; # xA0; biSizeImage: = 0;
# xA0; # xA0; biXPelsPerMeter: = 0;
# xA0; # xA0; biYPelsPerMeter: = 0;
# xA0; # xA0; biClrUsed: = 0;
# xA0; # xA0; biClrImportant: = 0;

# xA0; # xA0; FLineSize: = (biWidth + 1) * 3 și (-1 shl 2);

# xA0; # xA0; dacă (biWidth sau biHeight)<>0 atunci
# xA0; # xA0; începe
# xA0; # xA0; # xA0; DC: = CreateDC ("DISPLAY", zero, zero, zero);
# xA0; # xA0; # xA0; BM: = CreateDIBSection (DC, BI, DIB_RGB_COLORS, pointer (PB), 0, 0);
# xA0; # xA0; # xA0; DeleteDC (DC);
# xA0; # xA0; # xA0; dacă BM = 0 atunci // Eroare ("eroare la crearea DIB");
# xA0; # xA0; se încheie;
# xA0; sfârșitul;
se încheie;

# xA0; # xA0; # xA0; # xA0; pentru j: = 0 la BI.bmiHeader.biHeight-1 nu
# xA0; # xA0; # xA0; # xA0; # xA0; pentru i: = 0 la BI.bmiHeader.biWidth-1 nu
# xA0; # xA0; # xA0; # xA0; # xA0;
# xA0; # xA0; # xA0; # xA0; # xA0; //Pixels[i,j]^.Tr:=ParrRGBTriple(PF+j*FLineSize+Ofs) ^ [i];
# xA0; # xA0; # xA0; în cele din urmă
# xA0; # xA0; # xA0; # xA0; UnmapViewOfFile (PF);
# xA0; # xA0; # xA0; sfârșitul;
# xA0; # xA0; în cele din urmă
# xA0; # xA0; # xA0; CloseHandle (HM);
# xA0; # xA0; sfârșitul;
# xA0; în cele din urmă
# xA0; # xA0; FileClose (HF);
# xA0; sfârșitul;
se încheie;

puteți crea un bitmap (cutie neagră):

procedura TForm1.FormCreate (expeditor: TObject);
începe
# xA0; BMP: = TMBitmap.Creați (40, 20);
se încheie;

Dar nu puteți să trageți nimic pe el sau să-l încărcați în el (mai ales printr-un flux). Cum se poate schimba acest cod pentru a lucra cu acesta ca și cu un bitmap obișnuit. Numai încărcarea prin procedura LoadFromfile interesează cel mai puțin din toate. Mulțumesc!

Și ce nu a plăcut atunci TBitmap?
Flow, citiți doar în tampon. Mai mult, dezasamblam titlul. Un câmp de biți este introdus prin SetDIBits

Și puteți încerca puțin cum să corectați codul? Mulțumesc.







Articole similare

Trimiteți-le prietenilor: