Hogyan lehet gyorsan felvenni egy bájt a fájl

hogyan lehet gyorsan levelet byte a fájlt?

Itt egy darab az eljárás:
AssignFile (FLB, currpath + f_GrayTMP);
# XA0; reset (FLB);
# XA0; Seek (FLB, 1078);

# XA0; számítanak: = image1.Picture.Bitmap.Width * image1.Picture.Bitmap.Height;
# XA0; pix_p: = image1.Picture.Bitmap.RawImage.data;
# XA0; ha image1.Picture.Bitmap.pixelformat = pf32bit majd
# XA0; kezdődik
# XA0; # XA0; pix4out: = pix_p;
# XA0; # XA0 Inc. (pix4out, count);
# XA0; # XA0; ismétlés
# XA0; # XA0; # XA0; write (flb, pix4out ^ .rgbRed);
# XA0; # XA0; # XA0 dec (pix4out);
# XA0; # XA0; # XA0 dec (count);
# XA0; # XA0; amíg száma<=0;
# XA0; end; # XA0; # XA0; # XA0;

nagyon lassú írási fájlba (800 kb 3-4 másodperc) fájlt.
hogyan lehet felgyorsítani?

éN használ # XA0; FPC 2.6, de azt hiszem, a probléma nem a fordító és az a szemlélet

byte nem gyors.
nem gyorsan byte

Úgy tűnik, hogy a kód rögzíti a fordított darab memória fájl. A jobb sebességet, hogy átalakítsuk azt egy tömb, akkor a tömb teljesen írva a fájlok - a nagyobb darabokat írt gyorsabb.

Nos, igen, vagy
először hozzon létre egy darab memória 800kb, akkor töltsük ki, majd írd le egy fájlban

Ő átalakították egy tömb, # XA0; BlockWrite (FLB, pix_map [0], sizeof (pix_map [0]) * száma); Az iratokból nem nem rögzíti :(
# XA0; AssignFile (FLB, currpath + f_GrayTMP);
# XA0; reset (FLB);
# XA0; Seek (FLB, 1078);
# XA0; számítanak: = image1.Picture.Bitmap.Width * image1.Picture.Bitmap.Height;
# XA0; setlength (pix_map, count);
# XA0; i: = 0;
# XA0; pix_p: = image1.Picture.Bitmap.RawImage.data;
# XA0; ha image1.Picture.Bitmap.pixelformat = pf32bit majd
# XA0; kezdődik
# XA0; # XA0; pix4out: = pix_p;
# XA0; # XA0 Inc. (pix4out, count);
# XA0; # XA0; ismétlés
# XA0; # XA0; pix_map [i]: = pix4out ^ .rgbRed;
# XA0; # XA0; dec (pix4out);
# XA0; # XA0; dec (count);
# XA0; # XA0; Inc (i);
# XA0; # XA0; amíg száma<=0;
# XA0; end; # XA0; # XA0; # XA0; # XA0; # XA0; # XA0; # XA0;

BlockWrite (FLB, pix_map [0], sizeof (pix_map [0]) * száma);
CloseFile (FLB);

reset (FLB);
Elerted van második lehetőség

száma után a ciklus, amely egyenlő?

Általában itt egy ciklusban lehet jobb

Most lehetetlen levelet dinamikus tömb egy fájlba, hanem egy sor van írva, de a fájl mind nullák, a hibakereső adatokat a tömbben van egy
AssignFile (FLB, currpath + f_GrayTMP);
# XA0; reset (FLB, 1);
# XA0; Seek (FLB, 1078);
# XA0; számítanak: = image1.Picture.Bitmap.Width * image1.Picture.Bitmap.Height;
# XA0; setlength (pix_map, count);
# XA0; i: = 0;
# XA0; pix_p: = image1.Picture.Bitmap.RawImage.data;
# XA0; ha image1.Picture.Bitmap.pixelformat = pf32bit majd
# XA0; kezdődik
# XA0; # XA0; pix4out: = pix_p;
# XA0; # XA0 Inc. (pix4out, count);
# XA0; # XA0; i: = 0 számolni-1 do
# XA0; # XA0; kezdődik
# XA0; # XA0; # XA0; pix_map [i]: = pix4out ^ .rgbRed;
# XA0; # XA0; # XA0 dec (pix4out);
# XA0; # XA0; végén;
# XA0; end;
BlockWrite (FLB, pix_map [0], hossza (pix_map));
CloseFile (FLB);
pix_map: = nil; # XA0; # XA0; # XA0; # XA0; # XA0; # XA0; # XA0; # XA0; # XA0; # XA0; # XA0; # XA0; # XA0;

deklaráljuk # XA0;
FLB: file;
# XA0; pix_map: tömb byte;
Miért írt nullák?

A fájl általában valami írva? a rekord fájl megnyitásakor?

A régi módszerek a munka előnye a fájlt, mielőtt TFileStream nincs, ezért indokolt, hogy az utolsó.

A fájl van írva, hogy a tömb mérete növekszik, de csak nullák.
Most megpróbálom átfolyik

és milyen sorrendben elhelyezte byte pix_map?

És általában elfogadják, hogy vegye figyelembe:

funkció BitmapLineSize (const Bitmap: TBitmap): integer;
const
# XA0; // (pfDevice, pf1bit, pf4bit, pf8bit, pf15bit, pf16bit, pf24bit, pf32bit, pfCustom)
# XA0; PIXEL_SIZES: array [TPixelFormat] A integer = (0, 1, 4, 8, 16, 16, 24, 32, 0);
kezdődik
# XA0; Eredmény: = ((PIXEL_SIZES [Bitmap.PixelFormat] * Bitmap.Width + 31), és -32) SHR 3);
végén;


# XA0; BitmapData: NativeInt;
# XA0; LinearSize: integer;
# XA0; X, Y: integer;
# XA0; Pixel: PRGBQuad; // az pf32bit
.
# XA0; BitmapData: = NativeInt (Bitmap.ScanLine [0]);
# XA0; LinearSize: = -BitmapLineSize (Bitmap);
# XA0;
# XA0; // ciklus hozzáférést X / Y
# XA0; Y: = 0 Bitmap.Height-1 do
# XA0; X: = 0 Bitmap.Width-1 do
# XA0; kezdődik
# XA0; # XA0; Pixel: = Pointer (BitmapData + Y * LinearSize + X * sizeof (TRGBQuad));
# XA0; # XA0; //.
# XA0; end;

Van Graphics.BytesPerScanline.

A kihívás ez: hogy a kép (32bit, azaz igazítás nem kell figyelembe venni), átalakítani, hogy szürkeárnyalatúvá és tárolni a 8-bites paletta.
Én nem találtam, ahol FPC lehet létrehozni egy palettát bitmap osztály, mert csak írni egy fájlt, először fejet a palettán, majd az indexek maguk fordított sorrendben, hogy nyissa meg a bitmap

Úgy döntöttem, hogy ez könnyebb. Amikor az alapvonal kell tekinteni [0]
Szintén nem kell fürödni a machinációk a Y borulás Magasság

> Sapersky (20.11.13 14:32) [15]
> Van Graphics.BytesPerScanline.

A jelentése ugyanaz, kevesebb akció

> Úgy döntöttem, hogy ez könnyebb. Amikor az alapvonal kell tekinteni [0]

De a nulla vonal nem mindig a végén

> VA (20/11/13 14:34) [16]
> A probléma a következő: hogy a kép (32bit, azaz igazítás
> Nem kell figyelembe venni), átalakítani, hogy a szürkeárnyalatos
> És tárolt 8 bit palettized.
> Nem találtam ahol FPC létrehozhat egy palettát az osztályban bitmap,
> # XA0, mert csak írni egy fájlt, először fejet a paletta,
> # XA0; majd az indexek maguk fordított sorrendben, hogy nyissa ki a bittérkép

Duck kimeneti fájl is kell lennie Bitmap formátumban - azaz vonal alulról felfelé a + 4 byte igazítás

var
# XA0; szélesség, magasság, X, Y: integer;
# XA0; Gap;
# XA0; pixel, dest: pbyte;
# XA0; src: PRGBQuad; # XA0;
kezdődik
# XA0; szélesség: = Bitmap.Width;
# XA0; Magasság: = Bitmap.Height;
# XA0; GetMem (pixel, ((szélesség + 3) és -4) * magasság);
# XA0; Gap: = ((szélesség + 3) és -4) - Szélesség;
# XA0;
# XA0; dest: = pixel;
# XA0; src: = Bitmap.ScanLine [Magasság-1];
# XA0; Y: = 0 Magasság-1 do
# XA0; kezdődik
# XA0; # XA0; X: = 0 Szélesség-1 do
# XA0; # XA0; kezdődik
# XA0; # XA0; # XA0; // szürke algoritmus
# XA0; # XA0; # XA0; dest ^: = src.rgbRed;
# XA0; # XA0;
# XA0; # XA0; # XA0; // következő pixel
# XA0; # XA0; # XA0; Inc (src);
# XA0; # XA0; # XA0; Inc (dest);
# XA0; # XA0; end;

Igazad van. A gyakorlatban még soha nem találkoztam ilyen fájlokat, de ítélve a Graphics forráskód, így lehetőség van arra,

Tehát:
funkció BitmapLinearSize (const Bitmap: TBitmap): integer;
kezdődik
# XA0, ha (Bitmap.Heigth <= 1) then Result := 0
# XA0; máshol
# XA0; Eredmény: = NativeInt (Bitmap.ScanLine [1]) - NativeInt (Bitmap.ScanLine [0]);
végén;


> A gyakorlatban még soha nem találkoztam ilyen fájlok

Önmagában is használható, mert előbb-utóbb elfárad a szórakozni ezzel fordított.
De TBitmap (legalábbis a régebbi verziók), akkor valahogy görbe. Ha beállítja a magassága a negatív - a bitmap „normális”, de pozitív marad magasság. Lehet, hogy az új verzió jobb.

> Sapersky (20.11.13 15:03) [21]

Nos kacsa, mint a magassága a kép (TBitmap.Height) lehet negatív? Ez mindig pozitív. A hazai biHeight óta használják, ahogy kellene, ha scanline

funkció TBitmap.GetHeight: egész;
kezdődik
# XA0; Eredmény: = Abs (FImage.FDIB.dsbm.bmHeight);
végén;

Amikor kipróbáltam, a belső biHeight vagy bmHeight, mint a túl kap pozitív, és ennek eredményeként GetScanline meghibásodott.

Egy másik kérdés: hogyan kell írni a tömb egy fájlba?

> VA (20/11/13 17:28) [25]
> Egy másik kérdés: hogyan kell írni a tömb egy fájlba?

normálisan írtál
még nem töltötték meg
akkor töltse ki a tesztet, mint a 255 érték előtt írásban


> Nem megtöltötte

ne töltse ki az cikiusszámláió némi ijedtség meghatározni i: byte; változott, hogy egész, minden szerzett, kivéve, ha a fordító nem kell rámutatni ezt a hibát?

Mondom még egyszer nyomatékosan javasoljuk, hogy foglalkozik a sorainak elrendezését megértés

mert kitölti az elejétől a végéig, a végén, hogy az elején, nincs összehangolás 4 byte. ami hibás működéshez vezethet