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.

Kapcsolódó cikkek