Elektroda.pl
Elektroda.pl
X
Proszę, dodaj wyjątek www.elektroda.pl do Adblock.
Dzięki temu, że oglądasz reklamy, wspierasz portal i użytkowników.

[Delphi] Szukam czegoś na temat wskaźników bitmap w Delphi.

liamsd 12 Sie 2005 13:32 2328 8
  • #1 12 Sie 2005 13:32
    liamsd
    Poziom 9  

    procedure LoadBMP(FileName:String;var W,H:Word;var Bits:Pointer);

    Jeśli ktoś miałby jakieś interesujące informacje pomocne w uruchomieniu w/w procedury byłbym bardzo wdzięczny. Nie wiem po w jakim celu te parametry.

    0 8
  • #2 12 Sie 2005 14:32
    elektryk
    Poziom 42  

    Skąd jest ta funkcja?

    0
  • #4 12 Sie 2005 15:46
    liamsd
    Poziom 9  

    elektryk napisał:
    Skąd jest ta funkcja?



    Oto ona dostalem ja od innego pomocnego pana ale nie chce mi wytlumaczyc o co w tym chodzi.

    Ten kawałek kodu dostałem od innego pomocnego uzytkownika.Nie wiem w jaki sposob ja uruchomić i co za zadanie mają jej parametry a w szczególności istatni Bits typu Pointer. Wogóle jak te parametry wyciągnąć z dowolnego pliku BMP. Prosze pomóżcie mi. Chodzi mi również o konkretny przykład np. LoadBMP (sciezka, .....i tu nie wiem jak dalej i z czego to wziac.....)

    var InvertRys:Array[0..3*1024*768]of Byte; - zmienna globalna


    procedure LoadBMP(FileName:String;var W,H:Word;var Bits:Pointer);
    var Header:array[1..54]of byte;
    Zp:file;
    Result,i:integer;
    BiBitCount,Temp:byte;
    BiSizeImage,bitsize:dword;
    BS:Extended;
    begin
    assignfile(zp,FileName);
    reset(Zp,1);
    blockread(Zp,Header,54,Result);
    w:=Header[19]+Header[20]*256+Header[21]*65536; {szerokość obrazka}
    h:=Header[23]+Header[24]*256+Header[25]*65536; {wysokość obrazka}
    BiBitCount:=Header[29];
    BiSizeImage:=Header[35]+Header[36]*256+Header[37]*65536;
    BitSize:=BiSizeImage;
    if BitSize=0 then begin Bs:=(W*BiBitCount+7)/8*abs(H);BitSize:=Trunc(Bs); end;
    BlockRead(Zp,InvertRys,BitSize,Result);
    CloseFile(Zp);
    {W zmiennej InvertRys jest rysunke bajt po bajcie}
    {Pierwszy bajt zawiera składową czerwoną,drugi zieloną ,trzeci niebieską,itd}

    Bits:=@InvertRys
    end;

    0
  • #5 12 Sie 2005 20:28
    Piroman1024
    Poziom 16  

    Witam.
    Oto poprawiona procedura;
    Const maxx=1024;{maksymalna szerokość obrazka w pixelach}
    maxy=768;{maksymalna wysokość obrazka w pixelach}

    Type punkt=record
    red:byte;
    green:byte;
    blue:byte;
    end;

    var InvertRys:Array[0..3*maxx*mxxy]of Byte;
    Tablica:array[0..maxx,0..maxy]of punkt;{zmienne globalna}


    procedure LoadBMP(FileName:String;var W,H:Word);
    var Header:array[1..54]of byte;
    Zp:file;
    Result,i,x,y:integer;
    BiBitCount,Temp:byte;
    BiSizeImage,bitsize:dword;
    BS:Extended;
    begin
    assignfile(zp,FileName);
    reset(Zp,1);
    blockread(Zp,Header,54,Result);
    w:=Header[19]+Header[20]*256+Header[21]*65536; {szerokość obrazka}
    h:=Header[23]+Header[24]*256+Header[25]*65536; {wysokość obrazka}
    BiBitCount:=Header[29];
    BiSizeImage:=Header[35]+Header[36]*256+Header[37]*65536;
    BitSize:=BiSizeImage;
    if BitSize=0 then begin Bs:=(W*BiBitCount+7)/8*abs(H);BitSize:=Trunc(Bs); end;
    BlockRead(Zp,InvertRys,BitSize,Result);
    CloseFile(Zp);
    {W zmiennej InvertRys jest rysunke bajt po bajcie}
    {Pierwszy bajt zawiera składową czerwoną,drugi zieloną ,trzeci
    niebieską,itd}

    i:=0;
    x:=0;
    y:=0;
    repeat
    Tablica[x,y].red:=InvertRys[1];
    Tablica[x,y].green:=InvertRys[2];
    Tablica[x,y].blue:=InvertRys[3];
    if x<W then x:=x+1 else
    begin
    x:=0;
    y:=y+1;
    end;
    inc(i,3);
    until i>=BitSize;
    end;

    Po użyciu tej provedury w zmiennej tablica jest zapisany cały rysunek.
    Aby odczutać kolor pixela o współżędnych 10,10 robimy tak:
    Składowa czerwona:=Tablica[10,10].red;
    Składowa zielona:=Tablica[10,10].green;
    Składowa niebieska:=Tablica[10,10].blue;

    Procedura dodatkowo zwraca dwie wartości:
    W - szerokość obrazka w pixelach;
    H - wysokość obrazka w pixelach;

    Dodam jeszcze że w procedurze mogą występować błędy gdyż nie miałem możliwości jej sprawdzenia - brak Delphi.
    W razie kłopotów proszę pisać.

    0
  • #6 12 Sie 2005 21:46
    elektryk
    Poziom 42  

    Ta funkcja ładuje plik z obrazkime do pamięci RAM i w zmiennej bits zwraca (zmienna przekazana przed wskaźnik) wskaźnik na obszar pamięci zawierającej sam obraz.

    0
  • #7 14 Sie 2005 16:19
    liamsd
    Poziom 9  

    A czy Pan Piroman mógłby mi pomóc w wyprowadzeniu tego obrazka po binaryzacji na zewnątrz. Tzn zapisaniu go w postaci innego obrazu bmp, lub jpg. A jeszcze lepiej by było gdyby dodatkowo zapisać go w postaci jakiejś tablicy. Poźniej bedzię to moja tablica współrzędnych punktów do wyświetlenia.

    0
  • #8 14 Sie 2005 17:45
    Piroman1024
    Poziom 16  

    Pewie żebym mógł.
    Już napisałem że w zmiennej Tablica jest przechowywany cały rysunek wraz ze składowymi kazdego pixela.
    Z mojego punktu widzenia taka struktura danych jest bardzo wygodna do późniejszego jej wyśfietlenia przez taki laser.
    Proszę tylko dokładnie scharakteryzować swój problem(co ma robić program,w jakiej formie mają byc przedstawione dane wyjsciowe,itd.).
    W ostatniej procedurze wkradł się mały błąd:
    powinno być:
    [...]
    Tablica[x,y].red:=InvertRys[i]; {zamiasta 1 jest i}
    Tablica[x,y].green:=InvertRys[i+1]; {zamiast 2 jest i+1}
    Tablica[x,y].blue:=InvertRys[i+2]; {zamiast 3 jest i+2}
    [...]

    0
  • #9 14 Sie 2005 19:29
    liamsd
    Poziom 9  

    Mianowicie do pamięci lasera wysyłam małą ilośc, bo tylko 1000 pkt. Laser potrafi 100pkt/s wyświetlić na sekundę. (wydaje mi się, że
    obrazek wyświetlony w 1 sek. będzie w miarę rozpoznawalny).

    Obraz musi być w postaci kwadratu o rozmiarze 4095x4095. Wartośći X i Y 2047 jest centrum obrazu. (A więc bitmapa może być o większym rozmiarze ale stosunek jej boków musi tworzyć kwadrat. To chyba dam rade zrobić :) tak mi się wydaje). Następnie binaryzacja (lub też wykrycie krawędzi i potem dopiero binaryzacja), następnie z obrazku ta tablica. Potem wysyłaniem do sterownika zajmuje sie następująca funkcja.

    function LoadProgram(ProgNr : byte; QPoint : integer; speed : integer; desc : PChar; buf : array of smallint) : boolean; stdcall;

    w niej zmienna Buff jest tablica z której sterownik pobiera dane (dwie kolumny jedna X druga Y). Zmienna Qpoint jest ilością punktów króre można załadować do banku - max 1000 (tzn ze max 1000 wierszy)bo dwie dane to jedna współrzędna. Speed - prędkość odtwarzania danych 0 naszybciej 1000 najwolniej. Czyli przy mniejszej ilości punktów można przyśpieszyć wyświetlanie.

    Moim zdaniem (mogę się oczywiście mylić) po tych ceregielach z grafiką z obrazu należy zrobić tablicę 2 kolumnową. A potem załadować do pamięci tą funcją.

    Bardzo proszę o pomoc, odpowiedź i opinię. Bardzo Dziekuję.
    Michał

    P.s. Na konto wysyłam Ci inny program podsunięty od "elektryka" który dokonuję binaryzacji z progiem. Zobacz proszę to i osądź czy nie łatwiej byłoby skorzystać z tego.

    0