Splash Screen transparant?

Rund um die LCL und andere Komponenten

Re: Splash Screen transparant?

Beitragvon MmVisual » 19. Apr 2018, 18:18 Re: Splash Screen transparant?

Ich habe leider immer noch das Problem mit dem Splash-Screen unter RaspberryPi.

Beim Starten kann ich eine Bitmap-Maske anhand der Grafik ausrechnen, dies braucht leider ca. 7 Sekunden bis sie errechnet ist. Daher wollte ich die Maske als Ressource einfach in die EXE linken, dann braucht es so gut wie keine Zeit.

Das Problem: Sobald ich die von der EXE erzeugte Maske abspeichere und dann diese wieder rein lade wird die Maske nicht mehr richtig behandelt.

Code: Alles auswählen
 
  // Maske laden
  st := TLazarusResourceStream.Create('SplashMsk', 'PNG');
  imgSplashMask := TImage.Create(Self);
  imgSplashMask.Picture.Bitmap.SetSize(imgSplash.Width, imgSplash.Height);
  imgSplashMask.SetBounds(0, 0, imgSplash.Width, imgSplash.Height);
  //imgSplashMask.Picture.PNG.LoadFromStream(st);
  st.Free;
  imgSplashMask.Picture.Bitmap.Monochrome := True;
  for y := 0 To imgSplash.Picture.Bitmap.Height - 1 Do
  Begin
    for x := 0 To imgSplash.Picture.Bitmap.Width - 1 Do
    Begin
      If imgSplash.Picture.Bitmap.Canvas.Pixels[x,y] <> clWhite Then
        imgSplashMask.Picture.Bitmap.Canvas.Pixels[x,y] := clWhite
      Else imgSplashMask.Picture.Bitmap.Canvas.Pixels[x,y] := clBlack;
    end;
  end;
  imgSplashMask.Picture.SaveToFile('/home/pi/svn/SplashMskX.png');


Lazarus kann auch das Bild nicht als BMP Datei ablegen, die Datei ist dann immer 0 Byte groß. Meine Idee war, dass Lazarus das korrekte Bild erzeugt, speichert und ich das dann einfach nur noch benutzen muss.

Diese gleiche Datei einlesen und als Transparenz-Maske verwenden klappt nicht, dann ist nichts mehr transparent.

Egal welches Pixel-Format ich für die Grafik verwende, das mit der Transparenz klappt nur bei der Grafik, die das Lazarus selbst errechnet hatte.

PS: Unter Windows ist es kein Problem, da kann ich das Masken-Bild Problemlos aus der Ressource laden und aktivieren. Nur Linux spackt rum.

Dankeschön für eure Hilfe, Grüße Markus
MmVisual
 
Beiträge: 996
Registriert: 10. Okt 2008, 22:54
OS, Lazarus, FPC: Winux (L 1.6 FPC 3) | 
CPU-Target: 32/64Bit
Nach oben

Beitragvon Mathias » 19. Apr 2018, 18:56 Re: Splash Screen transparant?

Code: Alles auswählen
imgSplashMask.Picture.SaveToFile('/home/pi/svn/SplashMskX.png');

Versuche mal anstelle von PNG, BMP.

Code: Alles auswählen
imgSplashMask.Picture.Bitmap.SaveToFile('/home/pi/svn/SplashMskX.bmp');


Was noch eine Alternative wäre, erzeuge mit einem Hilfsprogramm eine Maske des Bildes als Konstante, zB. in eine maske.inc .
Code: Alles auswählen
var
  Mono_Bild: bitpacked array[0..255, 0..255] of Boolean;


Auf dem Raspi hast du dann folgende Konstante:
Code: Alles auswählen
const
  Maske: bitpacked array[0..255, 0..255] of Boolean = ((true, True, false....), (......)......);
Zuletzt geändert von Mathias am 19. Apr 2018, 19:13, insgesamt 2-mal geändert.
Mit Lazarus sehe ich gün
Mit Java und C/C++ sehe ich rot
Mathias
 
Beiträge: 4342
Registriert: 2. Jan 2014, 17:21
Wohnort: Schweiz
OS, Lazarus, FPC: Linux (die neusten Trunc) | 
CPU-Target: 64Bit
Nach oben

Beitragvon MmVisual » 19. Apr 2018, 19:05 Re: Splash Screen transparant?

Haha - ich habe schon alles durch. Auch ein direktes TBitmap geht natürlich auch nicht. Bin ja schon seit ein paar Tagen damit beschäftigt :-/
Bitmap gehen weder unter Linux noch unter Windows zu speichern.
MmVisual
 
Beiträge: 996
Registriert: 10. Okt 2008, 22:54
OS, Lazarus, FPC: Winux (L 1.6 FPC 3) | 
CPU-Target: 32/64Bit
Nach oben

Beitragvon Mathias » 19. Apr 2018, 19:12 Re: Splash Screen transparant?

Ich sehe, du bist an einem ähnlichen Problem angestossen, wie ich hier, im letzten Post mit dem 8-Bit Images.

viewtopic.php?f=18&t=11528&p=102861&hilit=tbitmap#p102861

Nur komisch, das Lazarus mit 1Bit auch blöde tut, da ja 1Bit offiziell unterstützt wird.
Mit Lazarus sehe ich gün
Mit Java und C/C++ sehe ich rot
Mathias
 
Beiträge: 4342
Registriert: 2. Jan 2014, 17:21
Wohnort: Schweiz
OS, Lazarus, FPC: Linux (die neusten Trunc) | 
CPU-Target: 64Bit
Nach oben

Beitragvon MmVisual » 19. Apr 2018, 19:27 Re: Splash Screen transparant?

Ich habe herausgefunden wie man 1Bit Bilder speichern und wieder laden kann:

TIF

geht! Ich habe halt alle Sorten durch probiert. Bei BMP und GIF gibt es direkt eine Exception . Das Anlagen/Speichern hab ich mit der Windows Lazarus EXE gemacht. Das Laden geht jetzt auch auf dem Raspi. (Das Übersetzen beim Raspi braucht bei meiner EXE ca. 3 Minuten, daher Windows)

Nun habe ich das TIF Bild als Ressource hinterlegt und kann es in das TImage.Picture.LoadFromStream() einlesen. Und das kann Lazarus auch als Shape-Maske für den Splash verwenden.

Ich hoffe mal das die Lazarus-Gemeinde jetzt nicht auch noch die TIF Bilder kaputt macht :roll:
MmVisual
 
Beiträge: 996
Registriert: 10. Okt 2008, 22:54
OS, Lazarus, FPC: Winux (L 1.6 FPC 3) | 
CPU-Target: 32/64Bit
Nach oben

Beitragvon Mathias » 19. Apr 2018, 21:47 Re: Splash Screen transparant?

Ich habe noch etwas probiert.
Wen man die 1Bit-Bitmap mit einem fremden Programm von PNG auf BMP umwandelt, dann kann man diese mit Lazarus öffnen.
Somit funktioniert folgender Code ohne Problem, inklusive das Speichern.
Code: Alles auswählen
procedure TForm1.Button1Click(Sender: TObject);
var
  bit:TBitmap;
begin
  bit := TBitmap.Create;
  bit.LoadFromFile('/home/tux/Schreibtisch/test.bmp');
 
  WriteLn(bit.PixelFormat);
 
  bit.SaveToFile('test.bmp');
 
  bit.LoadFromFile('test.bmp');
  bit.SaveToFile('test.bmp');
 
  bit.Free;
end;


Aber sobald man die Monochrom Bitmap selbst erzeugt, kommt beim Speichern wieder der Palettenfehler.
Entweder, man muss noch etwas aufrufen, oder dies ist ein Bug.
Code: Alles auswählen
procedure TForm1.Button2Click(Sender: TObject);
var
  bit: TBitmap;
begin
  bit := TBitmap.Create;
  bit.SetSize(256, 256);
  bit.Monochrome&#058;=True;
//  bit.PixelFormat := pf1bit; // geht auch nicht.
  //  bit.Clear;
 
  WriteLn(bit.PixelFormat);
 
  bit.SaveToFile('test2.bmp'); // Die geht nicht !
 
  bit.Free;
end;
Mit Lazarus sehe ich gün
Mit Java und C/C++ sehe ich rot
Mathias
 
Beiträge: 4342
Registriert: 2. Jan 2014, 17:21
Wohnort: Schweiz
OS, Lazarus, FPC: Linux (die neusten Trunc) | 
CPU-Target: 64Bit
Nach oben

Beitragvon MmVisual » 20. Apr 2018, 05:31 Re: Splash Screen transparant?

Das Bild der ersten Variante kann man zwar laden, aber Lazarus akzeptiert es dennoch nicht als Transparent-Maske unter Linux für den Splash Screen.
MmVisual
 
Beiträge: 996
Registriert: 10. Okt 2008, 22:54
OS, Lazarus, FPC: Winux (L 1.6 FPC 3) | 
CPU-Target: 32/64Bit
Nach oben

Beitragvon Mathias » 20. Apr 2018, 17:24 Re: Splash Screen transparant?

Das Bild der ersten Variante kann man zwar laden, aber Lazarus akzeptiert es dennoch nicht als Transparent-Maske unter Linux für den Splash Screen.

Irgendwie komisch, ein Monochrom-Images kennt doch nur schwarz und weiss. :roll:

Nochmals zusammengefasst.

Verwendet man eine fremde 1Bit-Images, kann Lazarus diese laden und speichern. Aber dafür funktioniert SetShape( nicht.

Erzeugt man die 1Bit-Images selbst, dann funktioniert SetShape(, dafür kann Lazarus dies nicht als *.bmp speichern.

Ist diese Behauptung richtig, oder habe ich etwas übersehen?

der Raspberry braucht 8 Sekunden.

Übrigens, kann man dies sehr stark beschleunigen, wen man anstelle von Pixels, direkt auf RawImage.Data zugreift.
Mit Lazarus sehe ich gün
Mit Java und C/C++ sehe ich rot
Mathias
 
Beiträge: 4342
Registriert: 2. Jan 2014, 17:21
Wohnort: Schweiz
OS, Lazarus, FPC: Linux (die neusten Trunc) | 
CPU-Target: 64Bit
Nach oben

Beitragvon MmVisual » 20. Apr 2018, 19:25 Re: Splash Screen transparant?

Ja genau so ist es. Bei Linux.

Raw Image ist absolut keine Option. Sobald intern im FPC was ändert und der Bildspeicher anders behandelt wird funktioniert das ganze nicht mehr. Hingegen die offiziell verfügbaren Funktionen gehen immer richtig.
MmVisual
 
Beiträge: 996
Registriert: 10. Okt 2008, 22:54
OS, Lazarus, FPC: Winux (L 1.6 FPC 3) | 
CPU-Target: 32/64Bit
Nach oben

Beitragvon Mathias » 20. Apr 2018, 20:41 Re: Splash Screen transparant?

[quote]Übrigens, kann man dies sehr stark beschleunigen, wen man anstelle von Pixels, direkt auf RawImage.Data zugreift.[quote]
Versuche mal die Demo im Anhang, ersetze dazu einfach das Bild in der TImage1 durch dein Bild.
Ist da die Geschwindigkeit auf dem Raspi akzeptabel ?
Und funktioniert es überhaupt.

Ich habe es gerade mit Wine probiert, anscheinend, ist nicht mal das Monochrom Bild unter Windows und Linux gleich. :roll:
Die Bitreihenfolge innerhalb der einzelnen Bytes ist vertauscht.
Aber wenigsten scheint es so, das das TImages nicht verändert wird.
Code: Alles auswählen
p^ := p^ or (1 shl bit); // Linux
p^ := p^ or (%10000000 shr bit); // Windows

Wen es nur noch an diesem kleine Problem liegt, würde ich eine Kompiler-Abfrage einbauen.

TBitmap das ominöse Ding. :roll:
Du hast keine ausreichende Berechtigung, um die Dateianhänge dieses Beitrags anzusehen.
Mit Lazarus sehe ich gün
Mit Java und C/C++ sehe ich rot
Mathias
 
Beiträge: 4342
Registriert: 2. Jan 2014, 17:21
Wohnort: Schweiz
OS, Lazarus, FPC: Linux (die neusten Trunc) | 
CPU-Target: 64Bit
Nach oben

Beitragvon Mathias » 20. Apr 2018, 20:48 Re: Splash Screen transparant?

Die Bitreihenfolge innerhalb der einzelnen Bytes ist vertauscht.

Dieses Problem ist nun auch gelöst.
Code: Alles auswählen
    if ABitmap.RawImage.Description.BitOrder = riboBitsInOrder then begin
      p^ := p^ or (1 shl bit);
    end else begin
      p^ := p^ or ((1 shl 7) shr bit);
    end;
Mit Lazarus sehe ich gün
Mit Java und C/C++ sehe ich rot
Mathias
 
Beiträge: 4342
Registriert: 2. Jan 2014, 17:21
Wohnort: Schweiz
OS, Lazarus, FPC: Linux (die neusten Trunc) | 
CPU-Target: 64Bit
Nach oben

Beitragvon MmVisual » 20. Apr 2018, 21:10 Re: Splash Screen transparant?

hm. :?:

2018-04-20-220336_1920x1080_scrot.png


So sieht das mit meinem Bild im Raspi aus.

Die einzige Möglichkeit ist nach wie vor ein TIF Bild sich als Resource zu halten und dieses dann mit einem Ressourcen-Stream zu holen, nur dann klappt das sicher & schnell.

Du hast es jedoch geschafft dass die Methoden sehr schnell sind, also ca 500ms benötigt die EXE um den Splash an zu zeigen. :)

Hier die Bilder als ZIP:
SplashImg.zip
Du hast keine ausreichende Berechtigung, um die Dateianhänge dieses Beitrags anzusehen.
MmVisual
 
Beiträge: 996
Registriert: 10. Okt 2008, 22:54
OS, Lazarus, FPC: Winux (L 1.6 FPC 3) | 
CPU-Target: 32/64Bit
Nach oben

Beitragvon Mathias » 20. Apr 2018, 21:19 Re: Splash Screen transparant?

Ist dein Bild nur auf drm Raspi zerstückelt, oder auch unter Win ?

Kannst du mal dein original Bild hochladen, dann kann ich es bei mir probieren.

Wie sieht es mit dem Baum auf dem Raspi aus, ist dieser io. ?
Zuletzt geändert von Mathias am 20. Apr 2018, 21:26, insgesamt 1-mal geändert.
Mit Lazarus sehe ich gün
Mit Java und C/C++ sehe ich rot
Mathias
 
Beiträge: 4342
Registriert: 2. Jan 2014, 17:21
Wohnort: Schweiz
OS, Lazarus, FPC: Linux (die neusten Trunc) | 
CPU-Target: 64Bit
Nach oben

Beitragvon MmVisual » 20. Apr 2018, 21:26 Re: Splash Screen transparant?

Anbei die Grafin bei Win7/64
Bild1.png


Die Original Bilder sind oben in meinem Letzten Beitrag im ZIP (von 22:10 Uhr)
Du hast keine ausreichende Berechtigung, um die Dateianhänge dieses Beitrags anzusehen.
MmVisual
 
Beiträge: 996
Registriert: 10. Okt 2008, 22:54
OS, Lazarus, FPC: Winux (L 1.6 FPC 3) | 
CPU-Target: 32/64Bit
Nach oben

Beitragvon Mathias » 20. Apr 2018, 21:31 Re: Splash Screen transparant?

Wie sieht mein Baum bei dir aus, ist dieser io. ?

Ich werde morgen mal dein Images angucken, mal gucken was ich da finde. :wink:
Mit Lazarus sehe ich gün
Mit Java und C/C++ sehe ich rot
Mathias
 
Beiträge: 4342
Registriert: 2. Jan 2014, 17:21
Wohnort: Schweiz
OS, Lazarus, FPC: Linux (die neusten Trunc) | 
CPU-Target: 64Bit
Nach oben

» Weitere Beiträge siehe nächste Seite »
VorherigeNächste

Zurück zu Komponenten und Packages



Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 4 Gäste

porpoises-institution
accuracy-worried