Splash Screen transparant?

Rund um die LCL und andere Komponenten
MmVisual
Beiträge: 1445
Registriert: Fr 10. Okt 2008, 23:54
OS, Lazarus, FPC: Winuxarm (L 3.0 FPC 3.2)
CPU-Target: 32/64Bit

Re: Splash Screen transparant?

Beitrag von MmVisual »

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
EleLa - Elektronik Lagerverwaltung - www.elela.de

Mathias
Beiträge: 6159
Registriert: Do 2. Jan 2014, 17:21
OS, Lazarus, FPC: Linux (die neusten Trunk)
CPU-Target: 64Bit
Wohnort: Schweiz

Re: Splash Screen transparant?

Beitrag von Mathias »

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 Do 19. Apr 2018, 20:13, insgesamt 2-mal geändert.
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot

MmVisual
Beiträge: 1445
Registriert: Fr 10. Okt 2008, 23:54
OS, Lazarus, FPC: Winuxarm (L 3.0 FPC 3.2)
CPU-Target: 32/64Bit

Re: Splash Screen transparant?

Beitrag von MmVisual »

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.
EleLa - Elektronik Lagerverwaltung - www.elela.de

Mathias
Beiträge: 6159
Registriert: Do 2. Jan 2014, 17:21
OS, Lazarus, FPC: Linux (die neusten Trunk)
CPU-Target: 64Bit
Wohnort: Schweiz

Re: Splash Screen transparant?

Beitrag von Mathias »

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 grün
Mit Java und C/C++ sehe ich rot

MmVisual
Beiträge: 1445
Registriert: Fr 10. Okt 2008, 23:54
OS, Lazarus, FPC: Winuxarm (L 3.0 FPC 3.2)
CPU-Target: 32/64Bit

Re: Splash Screen transparant?

Beitrag von MmVisual »

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:
EleLa - Elektronik Lagerverwaltung - www.elela.de

Mathias
Beiträge: 6159
Registriert: Do 2. Jan 2014, 17:21
OS, Lazarus, FPC: Linux (die neusten Trunk)
CPU-Target: 64Bit
Wohnort: Schweiz

Re: Splash Screen transparant?

Beitrag von Mathias »

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 grün
Mit Java und C/C++ sehe ich rot

MmVisual
Beiträge: 1445
Registriert: Fr 10. Okt 2008, 23:54
OS, Lazarus, FPC: Winuxarm (L 3.0 FPC 3.2)
CPU-Target: 32/64Bit

Re: Splash Screen transparant?

Beitrag von MmVisual »

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.
EleLa - Elektronik Lagerverwaltung - www.elela.de

Mathias
Beiträge: 6159
Registriert: Do 2. Jan 2014, 17:21
OS, Lazarus, FPC: Linux (die neusten Trunk)
CPU-Target: 64Bit
Wohnort: Schweiz

Re: Splash Screen transparant?

Beitrag von Mathias »

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 grün
Mit Java und C/C++ sehe ich rot

MmVisual
Beiträge: 1445
Registriert: Fr 10. Okt 2008, 23:54
OS, Lazarus, FPC: Winuxarm (L 3.0 FPC 3.2)
CPU-Target: 32/64Bit

Re: Splash Screen transparant?

Beitrag von MmVisual »

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.
EleLa - Elektronik Lagerverwaltung - www.elela.de

Mathias
Beiträge: 6159
Registriert: Do 2. Jan 2014, 17:21
OS, Lazarus, FPC: Linux (die neusten Trunk)
CPU-Target: 64Bit
Wohnort: Schweiz

Re: Splash Screen transparant?

Beitrag von Mathias »

[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:
Dateianhänge
Fenster_als_Bitmap.tar.gz
(195.18 KiB) 66-mal heruntergeladen
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot

Mathias
Beiträge: 6159
Registriert: Do 2. Jan 2014, 17:21
OS, Lazarus, FPC: Linux (die neusten Trunk)
CPU-Target: 64Bit
Wohnort: Schweiz

Re: Splash Screen transparant?

Beitrag von Mathias »

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 grün
Mit Java und C/C++ sehe ich rot

MmVisual
Beiträge: 1445
Registriert: Fr 10. Okt 2008, 23:54
OS, Lazarus, FPC: Winuxarm (L 3.0 FPC 3.2)
CPU-Target: 32/64Bit

Re: Splash Screen transparant?

Beitrag von MmVisual »

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
(25.67 KiB) 63-mal heruntergeladen
EleLa - Elektronik Lagerverwaltung - www.elela.de

Mathias
Beiträge: 6159
Registriert: Do 2. Jan 2014, 17:21
OS, Lazarus, FPC: Linux (die neusten Trunk)
CPU-Target: 64Bit
Wohnort: Schweiz

Re: Splash Screen transparant?

Beitrag von Mathias »

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 Fr 20. Apr 2018, 22:26, insgesamt 1-mal geändert.
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot

MmVisual
Beiträge: 1445
Registriert: Fr 10. Okt 2008, 23:54
OS, Lazarus, FPC: Winuxarm (L 3.0 FPC 3.2)
CPU-Target: 32/64Bit

Re: Splash Screen transparant?

Beitrag von MmVisual »

Anbei die Grafin bei Win7/64
Bild1.png
Bild1.png (80.61 KiB) 2076 mal betrachtet


Die Original Bilder sind oben in meinem Letzten Beitrag im ZIP (von 22:10 Uhr)
EleLa - Elektronik Lagerverwaltung - www.elela.de

Mathias
Beiträge: 6159
Registriert: Do 2. Jan 2014, 17:21
OS, Lazarus, FPC: Linux (die neusten Trunk)
CPU-Target: 64Bit
Wohnort: Schweiz

Re: Splash Screen transparant?

Beitrag von Mathias »

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 grün
Mit Java und C/C++ sehe ich rot

Antworten