Hogyan változtassuk meg a méret a bitmap memória
Hogyan változtassuk meg a méret a bitmap memória?
Egy jobb feladatot „Draw” részletesebben.
> Ezután standard eljárásokkal betöltéséhez szigorúbb képet.
Standard - ez hogyan? LoadFromFile?
Ha igen - akkor minden ilyen telepítési méreteket, és más dolog, hogy a kutyák.
Semmi értelme, hogy konfigurálja Bitmap betöltés előtt egy fájlból.
eljárás TForm1.onCtreate (Sender TObject.);
kezdődik
bittérképes: = Tbitmap.Create;
bitmap.Pixelformat: = pf24bit;
bitmap.Height: = 200;
bitmap.Width: = 300;
bitmap.LoadfromFile (D: / Saját mappa / Img_001.bmp);
Canvas.Draw (0,0, bittérkép);
végén;
Aztán maximalizálja az ablakot teljes képernyőre, és a folyamat onResize Meg kell változtatni a méretét Bitmap (skrech alkalmazási eljárás lehetséges!). Kell bitmar nagy méretű (képernyőméret):
jól hadd festeni rajta négyzetek sorban, és így tovább, akkor meg kell növelni a méretét a bitmap egy memória loading naimengey
Jelölje be ezt:
egység egység1;
felület
felhasználások
# XA0, a Windows, az Üzenetek, SysUtils, Változatok, osztályok, grafika, vezérlők, Forms,
# XA0; párbeszédablakok;
típus
# XA0; TForm1 = osztály (TForm)
# XA0; # XA0; eljárással FormCreate (Sender: TObject);
# XA0; # XA0; eljárással FormResize (Sender: TObject);
# XA0; # XA0; eljárással FormPaint (Sender: TObject);
# XA0; # XA0; eljárással FormClose (Sender: TObject; var Action: TCloseAction);
# XA0; magán-
# XA0; # XA0;
# XA0, köz-
# XA0; # XA0; BmpOrig, BmpTmp: TBitmap;
# XA0; # XA0;
# XA0; end;
var
# XA0; Form1: TForm1;
eljárás TForm1.FormCreate (Sender: TObject);
kezdődik
# XA0; BmpOrig: = TBitMap.Create;
# XA0; BmpOrig.LoadFromFile ( "D: \ Saját mappa \ Img_001.bmp");
végén;
eljárás TForm1.FormResize (Sender: TObject);
kezdődik
# XA0, próbálja
# XA0; ha nincs hozzárendelve (BmpTmp), majd BmpTmp: = TBitMap.Create;
# XA0; BmpTmp.Width: = szélesség div 2;
# XA0; BmpTmp.Height: = magasság div 2;
# XA0; BmpTmp.Canvas.StretchDraw (BmpTmp.Canvas.ClipRect, BmpOrig);
# XA0; érvényteleníti;
# XA0, kivéve
# XA0; ha Címzett (BmpTmp), majd FreeAndNil (BmpTmp);
# XA0; end;
végén;
eljárás TForm1.FormPaint (Sender: TObject);
kezdődik
# XA0; Canvas.Draw (10, 10, BmpTmp);
végén;
eljárás TForm1.FormClose (Sender: TObject; var Action: TCloseAction);
kezdődik
# XA0; ha hozzárendelt (BmpTmp), majd FreeAndNil (BmpTmp);
# XA0; ha hozzárendelt (BmpOrig), majd FreeAndNil (BmpOrig);
végén;
végén.
És újra.
> Eljárás TForm1.onCtreate (Sender TObject.);
> kezdődik
> Bitmap: = Tbitmap.Create;
> Bitmap.Pixelformat: = pf24bit;
> Bitmap.Height: = 200;
> Bitmap.Width: = 300;
Ez mind az összeomlás után:
> Bitmap.LoadfromFile (D: / Saját mappa / Img_001.bmp);
> Canvas.Draw (0,0, bittérkép);
> End;
Igen, Isten eltávolítja ebből bitmap.LoadfromFile. Vyavodim csak lyuoy rajz naprmier által scanline. és akkor meg kell, hogy nyúlik bitmar a teljes képernyőt, de hagyjuk a rajzot a scanline módszerrel, például, ahelyett, hogy a StretchDraw eljárást. Itt egy kérdés semmit. Hogyan változtassuk meg a bitmap méretét anélkül, hogy egy új képernyő mérete, mert ebben az esetben ő eszik egy csomó memóriát. Köszönöm.
> [6] Dr. Andrew # XA0; (29.08.07 18:48)
> Itt egy kérdés semmit. Hogyan változtassuk meg a méret a bitmap létrehozása nélkül
> Új képernyő méretben,
Hát én nem tudom. Mondtam egy példát dobta változás nélkül a kötött.
Itt helyett BmpTmp.Canvas.StretchDraw (BmpTmp.Canvas.ClipRect, BmpOrig);
Írja alapuló módszer scanline és ennyi.
És eszik, mert akkor nem a mindenki OnResize „e hoznak létre, de nem pusztult el.
Ie ez
> Ha bitmap <> nulla, akkor
> # XA0; bitmap.Free;
ha nem működik, és a bitmap hogy hozzon létre egy új, a régi (azaz. A memória által elfoglalt rá) nem mentesül.
> És eszik, mert akkor nem a mindenki OnResize „e
> Create de nem pusztult el.
> Ie ez
>
>> ha bitmap <> nulla, akkor
>> # XA0; bitmap.Free;
>
> Nem működik, és a bitmap hogy hozzon létre egy új, a régi (azaz.
> Memory által elfoglalt rá) nem mentesül.
Ie egy kicsit rossz, de az a tény, hogy a
> Bitmap.Free;
működni fog egyszer és minden, mint változó bitmap nem nilitsya. és aztán csak. végén [7]
Bocsánat. Páratlan, I végén [7] és [8] már zavaros magát. Most már kíváncsi. Írok :)
változások a pusztítás nem ad staogo bitmap
Azonban. Itt is van:
var bitmap. Tbitmap; // globális változót.
eljárás TForm1.onCtreate (Sender TObject.);
kezdődik
# XA0; bittérkép: = Tbitmap.Create;
# XA0; bitmap.LoadfromFile (D: / Saját mappa / Img_001.bmp);
végén;
eljárás TForm1.onResize (Sender TObject.);
kezdődik
# XA0, ha bitmap <> nil majd bitmap.Free;
# XA0; bittérkép: = Tbitmap.Create;
# XA0; bitmap.LoadfromFile (D: / Saját mappa / Img_001.bmp);
végén;
Nem szivárog nem lehet fék - igen. Lásd máshol szivárgást.
De a „nem helyes” kódot. Lásd a például [5] nincsenek többszörös létrehozása / törlés.
> [10] Dr. Andrew # XA0; (29.08.07 20:00)
?
Raškov. Köszönöm, de nem beszélünk LoadfromFile. Isten áldja sney - felejtsd el. Meg kell változtatni a méretét boshaya oldalán bitmap memória megtakarítás. Ez az a kérdés konrektny helyett polkemika fájlfeltöltés eljárást.
> [12] Dr. Andrew # XA0; (29.08.07 20:30)
De én nem a LoadfromFile :) Ott volt annyira. például a témában.
eljárás TForm1.FormPaint (Sender: TObject);
kezdődik
Canvas.StretchDraw (ClientRect, OrgBMP);
végén;
eljárás TForm1.FormCreate (Sender: TObject);
kezdődik
DoubleBuffered: = true;
OrgBMP: = TBitmap.Create;
OrgBMP.LoadFromFile ( "c: \ pp.bmp");
végén;
eljárás TForm1.FormDestroy (Sender: TObject);
kezdődik
OrgBMP.Free
végén;
eljárás TForm1.FormResize (Sender: TObject);
kezdődik
átfestés;
végén;
Nem úgy, mint StretchDraw, sozdovat bitmap deloy az eljárás uvilichenie. Memória bitmap, biztosan.
Lehetőség van a SetPixel, canvas.Pixels minden vytekayuschime lelassul.
Raškov - SetWidth (magasság) metódust a TBitmap - de mi ez? és ahol a bittérkép ilyen módszerek?
Pavia - ez nem a be- vagy a kirakodás, és változtatni a méretét bármely bitmap a gazdaságos felhasználása a memóriát.
> [15] Dr. Andrew # XA0; (29.08.07 20:53)
> SetWidth (magas) metódust a TBitmap - de mi ez?
Ez az, amikor a width tulajdonság (Magasság) van rendelve egy új értéket, majd futtassa védett (protected) módszerek.
Elv. Igen, itt, és nem kell egy második bitmap. Még fáradt ez méretekkel :). csak egy [14], amelyben az elején az eredeti feltöltési képek, és a skála (kijelző), ahogy tetszik a vásznon. és nem kell változtatni a méreteket.
És mi az, hogy minden alkalommal létrehozni, törölni. Miután létrehozott és módosíthatja a méretet.
var
bmp, tmp: TBitmap;
NewWidth, NewHeight: integer;
kezdődik
NewWidth: = 1000;
NewHeight: = 1000;
orgbmp.Assign (BMP); - nem szükséges
Csak dolgozni bmp
> Dr. Andrew
Meg tudja magyarázni többet, amire szüksége van valamire. )
Írjon TBitmapInfoHeader.biWidth új értéket, és nem gőzölt. - bizonyára észrevette. De ha valami ironikus ebben a tekintetben, akkor lehet gondolni?
> [21] Dr. Andrew # XA0; (29.08.07 21:46)
> De ha ironikusan valami ebben a tekintetben, akkor lehet gondolni?
Lehetséges. Csak már feltalálták - TBitmap
:)
De ha részletesen leírja, mi van és amire szüksége van, akkor tud válaszolni.
Különösen a [21] nem lesz képes segíteni.
> De ha ironikusan valami ebben a tekintetben, akkor lehet gondolni?
Azt akarom, hogy egy tégla ház nélküli tégla?
Írtam neked. Tedd a modul írni / olvasni, BMP. És szól részben.
Itt a kód megteremtse a bitmap jobb elég tudása hozzá:
TMBitmap = osztály
# XA0; magán-
# XA0; # XA0;
# XA0; # XA0; # XA0; FLineSize: integer;
# XA0; # XA0; # XA0; BM. THandle;
# XA0; # XA0; # XA0; eljárással Kiosztani (SX, SY: integer);
# XA0, köz-
# XA0; # XA0;
# XA0; # XA0; tulajdon Handle. THandle olvasni BM;
# XA0; # XA0; kivitelező létrehozása (szélesség, magasság egész.);
# XA0; # XA0; destructor megsemmisíti; felülbírálhatja;
# XA0; # XA0; eljárással LoadFromFile (const fájlnév: string);
# XA0; end;
típus
# XA0; TarrRGBTriple = array [byte] a TRGBTriple;
# XA0; ParrRGBTriple = ^ TarrRGBTriple;
kivitelező TMBitmap.Create (szélesség, magasság egész.);
kezdődik
# XA0; örökölt létrehozása;
# XA0; kiosztása (szélesség, magasság);
végén;
destructor TMBitmap.Destroy;
kezdődik
# XA0; örökölt;
végén;
eljárás TMBitmap.Allocate (SX, SY: integer);
var DC: HDC;
# XA0; # XA0 PB: Pointer;
# XA0; # XA0; BI: tagBITMAPINFO;
kezdődik
# XA0, ha BM<>0, akkor DeleteObject (BM);
# XA0; BM: = 0; # XA0; PB: = nil;
# XA0; fillchar (BI, sizeof (BI), 0);
# XA0, azzal BI.bmiHeader do
# XA0; kezdődik
# XA0; # XA0; biSize: = sizeof (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 és (-1 SHL 2);
# XA0; # XA0, ha (biWidth vagy biHeight)<>0, akkor
# XA0; # XA0; kezdődik
# XA0; # XA0; # XA0; DC: = CreateDC ( "DISPLAY", nulla, nulla, nulla);
# XA0; # XA0; # XA0; BM: = CreateDIBSection (DC, BI, DIB_RGB_COLORS, mutató (PB), 0, 0);
# XA0; # XA0; # XA0; DeleteDC (DC);
# XA0; # XA0; # XA0; ha BM = 0, akkor // hiba ( "error létrehozása DIB");
# XA0; # XA0; végén;
# XA0; end;
végén;
# XA0; # XA0; # XA0; # XA0; j: = 0 BI.bmiHeader.biHeight-1 do
# XA0; # XA0; # XA0; # XA0; # XA0; i: = 0 BI.bmiHeader.biWidth-1 do
# XA0; # XA0; # XA0; # XA0; # XA0;
# XA0; # XA0; # XA0; # XA0; # XA0; //Pixels[i,j]^.Tr:=ParrRGBTriple(PF+j*FLineSize+Ofs)^[i];
# XA0; # XA0; # XA0, végül
# XA0; # XA0; # XA0; # XA0; UnmapViewOfFile (PF);
# XA0; # XA0; # XA0; end;
# XA0; # XA0, végül
# XA0; # XA0; # XA0; CloseHandle (HM);
# XA0; # XA0; end;
# XA0, végül
# XA0; # XA0; FileClose (HF);
# XA0; end;
végén;
hozzon létre egy bitmap lehet (fekete doboz):
eljárás TForm1.FormCreate (Sender: TObject);
kezdődik
# XA0; BMP: = TMBitmap.Create (40, 20);
végén;
hanem felhívni rá, vagy töltse le (különösen annak szükségességét, hogy áramlás) semmi sem lehetetlen. Hogy tudom módosítani ezt a kódot dolgozni vele, mint egy szabályos bitmap. Miután a letöltés eljárást LoadFromfile érdekelt menit minden. Köszönjük!
És mi az TBitmap nem elégedett?
Stream, csak olvassa be a puffer. Továbbá, hogy megértsék a főcím. Egy kicsit mező sodródik keresztül SetDIBits
És lehetséges, egy kis példa arra, hogyan állítsuk be a fenti kódot? Köszönöm.