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.