Einzelnen Beitrag anzeigen

Benutzerbild von kwhk
kwhk

Registriert seit: 25. Mär 2009
Ort: Dresden
168 Beiträge
 
Delphi 10.3 Rio
 
#5

AW: BMP ohne TBITMAP anzeigen

  Alt 3. Nov 2016, 16:32
Nochmals DANKE.
Ich habe alles nochmal durchgesehen und die Verwechselungen beseitigt. Jetzt funktioniert es.
Hier noch einmal der berichtigte Code. ich habe nach dem tagBitmapInfo nur noch die Colors 1..255 definiert, weil [0,0] bereits in tagBitmapInfo enthalten ist.
Code:
  TPixelArr   = Array[1..200,1..320] of Byte;

  ThkBMP = RECORD // Länge = 65.078 Bytes
    bmf        : TBitMapFileHeader;        //    14 Bytes +    0
    bminfo     : tagBitmapInfo;            //    44 Bytes +   14
    bmiColors2  : Array[1..255] of RGBQUAD; //  1020 Bytes +   58   Rot, Grüm, Blau FARB-PALLETTE
    bmPixelArr : TPixelArr;                // 64000 Bytes + 1078  Pixel
  End; // ThkBMP = RECORD                   //             +65078  ---- Ende der BMP -----

Var
  hkBMP : ThkBMP;
Die Pointer-Variablen habe ich weggelassen und stattdessen die Angaben direkt eingetragen
Code:
    StretchDIBits ( Form1.Canvas.Handle, // DIB-Quelle in ZIEL-Fenster angepaßt
                    10,                 // X-Ursprung-Fenster
                    10,                 // Y-Ursprung-Fenster
                    960,                // Fenster-Breite
                    600,                // Fenster-Höhe
                    0,                  // X-Ursprung-BMP
                    0,                  // Y-Ursprung-BMP
                    320,                // X-Breite BMP
                    200,                // Y-Höhe  BMP
                    @(hkBMP.bmPixelArr), // Anf Bild-Daten in hkBMP+1078
                    hkBMP.bminfo,       // tagBitMapInfo
                    DIB_RGB_COLORS,     // Die Farb-Tab enthält RGB-Werte
                    SRCCOPY ) ;         // Operation: Quelle => Ziel kopieren
Ich hoffe, ich darf noch eine Zusatzfrage stellen...

Gibt es eine Möglichkeit, Farbcodes direkt in Bmp.Canvas.Pixels einzutragen, wenn man statt einem RECORD, wie ich es gemacht habe, TBITMAP verwendet und kann man auch auf die Einträge in der Colortabelle Einfluss nehmen ?
Ich habe das versucht, es gibt keinen Fehler, aber in der erzeugten BMP stehen nicht die von mir gewünschten Farbeinträge, sondern nahezu alles ist 0.
Code:
Procedure MakeBMP2;
  Var
    Bmp : TBitmap;
    yZei, xSpa, i : Integer;
    by : Byte;
    H : HPalette;
    P : PLogPalette;
  Begin
    Bmp := TBitmap.Create;
    Bmp.Width := 320;
    Bmp.Height := 200;
    Bmp.PixelFormat := pf8bit;

    GetMem(P, SizeOf(TLogPalette) + (SizeOf(TPaletteEntry) * 255));

    P.palVersion := $300;
    P.palNumEntries := 256;

    for i := 0 to 255 do
      Begin
        P.palPalEntry[i].peFlags := 0;
        Case i of
          0: Begin
               P.palPalEntry[i].peBlue    := $00; // 0 = Schwarz
               P.palPalEntry[i].peGreen   := $00;
               P.palPalEntry[i].peRed     := $00;
             End;
          1: Begin
               P.palPalEntry[i].peBlue    := $FF; // 1 = CYAN
               P.palPalEntry[i].peGreen   := $FF;
               P.palPalEntry[i].peRed     := $00;
             End;
          2: Begin
               P.palPalEntry[i].peBlue    := $FF; // 2 = Magenta
               P.palPalEntry[i].peGreen   := $00;
               P.palPalEntry[i].peRed     := $FF;
             End;
          3: Begin
               P.palPalEntry[i].peBlue    := $FF; // 3 = Weiss
               P.palPalEntry[i].peGreen   := $FF;
               P.palPalEntry[i].peRed     := $FF;
             End;
          else
             Begin
               P.palPalEntry[i].peRed  := 0;
               P.palPalEntry[i].peGreen := 0;
               P.palPalEntry[i].peBlue := 0;
             End;
        End; // Case
      End;

    H := CreatePalette(P^);

    if H <> 0 then
      Bmp.Palette := H;

    for yZei := 1 to 200 do
      Begin
        for xSpa := 1 to 320 do
          Begin
            by := ELEVBINarr[yZei,xSpa];
            Bmp.Canvas.Pixels[xSpa-1,yZei-1] := by;
          End; // for xSpa
      End; // for yZei

    Bmp.SaveToFile(DsnBMP2);

    FreeMem(P);
  End;
Hartmut

Geändert von kwhk ( 3. Nov 2016 um 16:51 Uhr)
  Mit Zitat antworten Zitat