DGL
https://delphigl.com/forum/

glBitmap
https://delphigl.com/forum/viewtopic.php?f=14&t=7457
Seite 9 von 9

Autor:  Jens01 [ Mi Dez 30, 2015 12:25 ]
Betreff des Beitrags:  Re: glBitmap

Wie!? Bild

Autor:  Bergmann89 [ Mi Dez 30, 2015 17:37 ]
Betreff des Beitrags:  Re: glBitmap

TAK hat auf meinen Beitrag vom Februar geantwortet ^^
Kommst du bei der TBitmap32 iwie an die Daten/Scanline ran?

€: guck dir mal TglBitmapData.AssignFromBitmap (aus dem aktuellen master-Branch) an, die sollte das selbe machen.

Autor:  mathias [ Mi Dez 30, 2015 17:53 ]
Betreff des Beitrags:  Re: glBitmap

Zitat:
TBitmap32

Was ist das für ein Format, ist dies Delphi spezifisch ?

Mit Lazarus und Google kann ich nichts schlaues finden.

Autor:  TAK2004 [ Mi Dez 30, 2015 18:52 ]
Betreff des Beitrags:  Re: glBitmap

Ich rede mich mal mit jahresputz raus 8)

Autor:  Jens01 [ Do Dez 31, 2015 14:20 ]
Betreff des Beitrags:  Re: glBitmap

@mathias
Graphics32 ist eigentlich was Bekanntes. Gut, es war anfangs nur für Delphi jetzt geht Bitmap32 auch für Lazarus usw. Ist bei CodeTyphon mit drin.

@Bergmann89
Ja, Scanline gibt es natürlich. Aber TBitmap32 läuft im Standard mit BGRA. Das kann man per Direktive umstellen. Habe aber gerade etwas Angst, dass der Rest meines Codes dabei Probleme bekommt.

P.S.: Wenn ich bei glBitmap die Direktive für PNG (Delphi) aktiviere, dann gibt es Fehler.

Autor:  Bergmann89 [ Do Dez 31, 2015 18:40 ]
Betreff des Beitrags:  Re: glBitmap

Hey,

hast du dir dir verlinkte Methode mal angesehen? Du musst nur das passende glBitmap Format für dein TBitmap32 Format auswählen und die Daten kopieren. Genau das macht die Methode. TBitmap nutzt auch BGRA, sollte also fast 1 zu 1 das selbe sein wie TBitmap32.

Was für Fehler (welche Zeile)? Ich versuch natürlich immer alles kompatibel zu allen Compilern zu halten, aber manchmal schleichen sich kleine Fehler ein. Kannst du das schnell selber fixen und vlt nen Patch hochladen? Wenn nicht, was genau nutzt du als Compiler?

MfG Bergmann

Autor:  Jens01 [ Do Dez 31, 2015 18:53 ]
Betreff des Beitrags:  Re: glBitmap

@Bergmann
Mache ich noch..
Jetzt wünsche ich Dir und allen hier ein schönes und insbesondere friedliches Jahr 2016

Autor:  Jens01 [ Fr Jan 01, 2016 15:23 ]
Betreff des Beitrags:  Re: glBitmap

So..., es geht, wenn man AssignFromBitmap überlädt und GR32 in uses packt:

bei diesem IntFormat bin ich mir nicht ganz sicher.

Code:
  1.  
  2. uses  [...] {$IFDEF GLB_DELPHI}           Dialogs, Graphics, Types, GR32,     {$ENDIF} [...]
  3.  
  4. function TglBitmapData.AssignFromBitmap(const aBitmap: TBitmap32): Boolean;
  5. var
  6.   pSource: PColor32Array;
  7.   pData, pTempData: PByte;
  8.   Row, RowSize, TempWidth, TempHeight: Integer;
  9.   IntFormat: TglBitmapFormat;
  10. begin
  11.   result := false;
  12.  
  13.   if (Assigned(aBitmap)) then
  14.   begin
  15.     IntFormat := tfBGRA8ub4;
  16.     TempWidth  := aBitmap.Width;
  17.     TempHeight := aBitmap.Height;
  18.     RowSize    := TFormatDescriptor.Get(IntFormat).GetSize(TempWidth, 1);
  19.     GetMem(pData, TempHeight * RowSize);
  20.  
  21.     try
  22.       pTempData := pData;
  23.       for Row := 0 to TempHeight -1 do
  24.       begin
  25.         pSource := aBitmap.Scanline[Row];
  26.         if (Assigned(pSource)) then
  27.         begin
  28.           Move(pSource^, pTempData^, RowSize);
  29.           Inc(pTempData, RowSize);
  30.         end;
  31.       end;
  32.       SetData(pData, IntFormat, TempWidth, TempHeight);
  33.       result := true;
  34.     except
  35.       if Assigned(pData) then
  36.         FreeMem(pData);
  37.       raise;
  38.     end;
  39.   end;
  40. end;

Autor:  Bergmann89 [ Fr Jan 01, 2016 16:56 ]
Betreff des Beitrags:  Re: glBitmap

Wenn das Ergebnis stimmt, dann passt das Format. Is die TBitmap32 immer BGRA8, oder kann die wie die TBitmap auch andere Formate? Wenn ja solltest du die der Vollständigkeit halber auch noch implementieren.

Autor:  Jens01 [ Fr Jan 01, 2016 18:39 ]
Betreff des Beitrags:  Re: glBitmap

Wenn man das ganz richtig machen möchte, dann vielleicht so :
Code:
  1. {$I GR32.inc}
  2.  
  3. {$IFDEF RGBA_FORMAT}
  4.   IntFormat := tfRGBA8ub4;
  5. {$ELSE}
  6.   IntFormat := tfBGRA8ub4;  
  7. {$ENDIF}

Für mich reicht aber erst mal obiges.
Andere Formate hat GR32 anscheinend nicht.

Autor:  Jens01 [ Fr Jan 01, 2016 18:51 ]
Betreff des Beitrags:  Re: glBitmap

Hier die Fehler bei GLB_PNGIMAGE :

Code:
  1. function TglBitmapData.LoadPNG(const aStream: TStream): Boolean;
  2. var
  3.   StreamPos: Int64;
  4.   Png: TPNGObject;
  5.   Header: String[8];
  6.   Row, Col, PixSize, LineSize: Integer;
  7.   NewImage, pSource, pDest, pAlpha: pByte;
  8.   PngFormat: TglBitmapFormat;
  9.   FormatDesc: TFormatDescriptor;
  10.  
  11. const
  12.   PngHeader: String[8] = #137#80#78#71#13#10#26#10;
  13.  
  14. begin
  15.   result := false;
  16.  
  17.   StreamPos := aStream.Position;
  18.   aStream.Read(Header[0], SizeOf(Header));
  19.   aStream.Position := StreamPos;
  20.  
  21.   {Test if the header matches}
  22.   if Header = PngHeader then begin
  23.     Png := TPNGObject.Create;
  24.     try
  25.       Png.LoadFromStream(aStream);
  26.  
  27.       case Png.Header.ColorType of
  28.         COLOR_GRAYSCALE:
  29.           PngFormat := tfLuminance8ub1;
  30. //        COLOR_GRAYSCALEALPHA:
  31. //          PngFormat := tfLuminance8Alpha8us1;   <= Das Format gibt es nicht
  32.         COLOR_RGB:
  33.           PngFormat := tfBGR8ub3;
  34.         COLOR_RGBALPHA:
  35.           PngFormat := tfBGRA8ub4;
  36. //        else
  37. //          raise EglBitmapException.Create ('LoadPng - Unsupported Colortype found.');   <= das gibt es nicht
  38.       end;
  39.  
  40.       FormatDesc := TFormatDescriptor.Get(PngFormat);
  41. //      PixSize    := Round(FormatDesc.PixelSize);    <= PixelSize gibt es nicht
  42.       LineSize   := FormatDesc.GetSize(Png.Header.Width, 1);
  43.  
  44.       GetMem(NewImage, LineSize * Integer(Png.Header.Height));
  45.       try
  46.         pDest := NewImage;
  47.  
  48.         case Png.Header.ColorType of
  49.           COLOR_RGB, COLOR_GRAYSCALE:
  50.             begin
  51.               for Row := 0 to Png.Height -1 do begin
  52.                 Move (Png.Scanline[Row]^, pDest^, LineSize);
  53.                 Inc(pDest, LineSize);
  54.               end;
  55.             end;
  56.           COLOR_RGBALPHA, COLOR_GRAYSCALEALPHA:
  57.             begin
  58.               PixSize := PixSize -1;
  59.  
  60.               for Row := 0 to Png.Height -1 do begin
  61.                 pSource := Png.Scanline[Row];
  62.                 pAlpha := pByte(Png.AlphaScanline[Row]);
  63.  
  64.                 for Col := 0 to Png.Width -1 do begin
  65.                   Move (pSource^, pDest^, PixSize);
  66.                   Inc(pSource, PixSize);
  67.                   Inc(pDest, PixSize);
  68.  
  69.                   pDest^ := pAlpha^;
  70.                   inc(pAlpha);
  71.                   Inc(pDest);
  72.                 end;
  73.               end;
  74.             end;
  75.           else
  76. //            raise EglBitmapException.Create ('LoadPng - Unsupported Colortype found.');   <= das gibt es auch nicht
  77.         end;
  78.  
  79.         SetData(NewImage, PngFormat, Png.Header.Width, Png.Header.Height);
  80.  
  81.         result := true;
  82.       except
  83.         if Assigned(NewImage) then
  84.           FreeMem(NewImage);
  85.         raise;
  86.       end;
  87.     finally
  88.       Png.Free;
  89.     end;
  90.   end;
  91. end;


Code:
  1. procedure TglBitmapData.SavePNG(const aStream: TStream);
  2. var
  3.   Png: TPNGObject;
  4.  
  5.   pSource, pDest: pByte;
  6.   X, Y, PixSize: Integer;
  7.   ColorType: Cardinal;
  8.   Alpha: Boolean;
  9.  
  10.   pTemp: pByte;
  11.   Temp: Byte;
  12. begin
  13.   if not (ftPNG in FormatGetSupportedFiles (Format)) then
  14.     raise EglBitmapUnsupportedFormat.Create(Format);
  15.  
  16.   case Format of
  17.     tfAlpha8ub1, tfLuminance8ub1: begin
  18.       ColorType := COLOR_GRAYSCALE;
  19.       PixSize   := 1;
  20.       Alpha     := false;
  21.     end;
  22. //    tfLuminance8Alpha8us1: begin   <= gibt es nicht
  23. //      ColorType := COLOR_GRAYSCALEALPHA;
  24. //      PixSize   := 1;
  25. //      Alpha     := true;
  26. //    end; [...]

Seite 9 von 9 Alle Zeiten sind UTC + 1 Stunde
Powered by phpBB® Forum Software © phpBB Group
https://www.phpbb.com/