Elektroda.pl
Elektroda.pl
X

Search our partners

Find the latest content on electronic components. Datasheets.com
Please add exception to AdBlock for elektroda.pl.
If you watch the ads, you support portal and users.

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

liamsd 12 Aug 2005 13:32 2475 8
  • #1
    liamsd
    Level 10  
    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.
  • #2
    elektryk
    Level 42  
    Skąd jest ta funkcja?
  • #4
    liamsd
    Level 10  
    elektryk wrote:
    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;
  • #5
    Piroman1024
    Level 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ć.
  • #6
    elektryk
    Level 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.
  • #7
    liamsd
    Level 10  
    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.
  • #8
    Piroman1024
    Level 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}
    [...]
  • #9
    liamsd
    Level 10  
    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.