JPG oder PNG mit anderen Farben mischen

Für Probleme bezüglich Grafik, Audio, GL, ACS, ...
Michl
Beiträge: 2505
Registriert: Di 19. Jun 2012, 12:54

Re: JPG oder PNG mit anderen Farben mischen

Beitrag von Michl »

ConcAPPtLab hat geschrieben:Hat aber nicht geklappt. Ich konnte nämlich Nutzung... -> Installieren nicht auswählen, sondern nur Nutzung... -> zum Projekt hinzufügen.
Alles gut, wenn keine Komponenten bereit gestellt werden, kann man auch keine installieren. Erst, wenn z.B. die BGRAControls installiert werden, werden diese auch in der Komponentenpalette bereit gestellt.

Du kannst einfach das Package zum Projekt hinzufügen (unter Projektinspektor oder eben über Package -> Nutzung... -> zum Projekt hinzufügen) und dann dynamisch ein TBRABitmap erstellen etc.

ConcAPPtLab hat geschrieben:Und das hat nicht dazu beigetragen, dass PBGRAPixel bekannt ist...
Jetzt einfach

Code: Alles auswählen

uses ..., BGRABitmap, BGRABitmapTypes; 


PS: Ich würde das vermutlich aber eher per TLazIntfImage machen (siehe Link von theo).

Code: Alles auswählen

type
  TLiveSelection = (lsMoney, lsChilds, lsTime);
  TLive = Array[0..1] of TLiveSelection; 

ConcAPPtLab
Beiträge: 89
Registriert: Fr 18. Apr 2014, 18:57

Re: JPG oder PNG mit anderen Farben mischen

Beitrag von ConcAPPtLab »

Ahh Gott. Es hat daran gelegen, dass ich BGRABitmapTypes nicht eingebunden habe :kopfgegenwandhämmer:

Danke, jetzt funktioniert alles.

Ich habe mir TLazIntfImage mal angesehen, aber irgendwie hat BGRABitmap besser meine Anforderungen erfüllt, so auf den ersten Blick betrachtet.

Denn ich möchte wie eingangs erwähnt ein Bild (möglichst mit einer flüssigen Fadeanimation) beim Hovern abdunkeln. Dabei soll nicht das gesamte Bild abgedunkelt werden, sondern ab ca. 80% Bildgröße der Schwarzanteil immer weniger werden, bis das Bild dann irgendwann oben nicht mehr abgedunkelt ist. Über die abgedunkelte Fläche soll dann ein Text drüber etc.

Es sah zwar so aus, als könnte man das auch irgendwie mit LazIntfImage machen, aber BGRABitmap schien doch einen größeren Funktionsumfang zu haben. Für mich wichtig ist, was schneller (und damit die Animation flüssiger) macht. Ob das die PBGRAPixel oder das LazIntfImage ist (das ja laut dem verlinkten Wikipedia Artikel doch recht schon sein soll).

Da würden mich mal eure Meinungen interessieren.
Definition "Strategische Fehlerkorrektur":
Solange rumprobieren bisses klappt :D

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

Re: JPG oder PNG mit anderen Farben mischen

Beitrag von Mathias »

Ahh Gott. Es hat daran gelegen, dass ich BGRABitmapTypes nicht eingebunden habe :kopfgegenwandhämmer:

Wen ich die Unit zu einem DatenType suche, mache ich dies meistens mit Google.

Z.B. lazarus PBGRAPixel
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot

ConcAPPtLab
Beiträge: 89
Registriert: Fr 18. Apr 2014, 18:57

Re: JPG oder PNG mit anderen Farben mischen

Beitrag von ConcAPPtLab »

Ja, mache ich ja im Normalfall auch so, aber dieses Mal habe ich gar nicht daran gedacht, dass es daran liegen könnte.
Weil der Wikipedia Artikel, von dem ich den Code habe - ja EIGENTLICH zu BGRABitmap ist. Und außerdem dachte ich noch, dass die ganzen Units der Zip untereinander verbunden sind, sodass man wirklich nur die BGRABitmap einbinden muss.
Naja, hinterher ist man immer schlauer.

Das Einbinden ist jetzt erst einmal abgehakt, ich danke allen Teilnehmern für die viele Hilfe :)

Vielleicht kann einer ja noch was zu meinem vorherigen Post schreiben, das Problem an sich ist erst einmal gelöst. Danke dafür

LG
ConcAPPtLab
Definition "Strategische Fehlerkorrektur":
Solange rumprobieren bisses klappt :D

Michl
Beiträge: 2505
Registriert: Di 19. Jun 2012, 12:54

Re: JPG oder PNG mit anderen Farben mischen

Beitrag von Michl »

Habe mich mal zu einem Vergleich hinreisen lassen und stelle erstaunt fest, dass BGRABitmap bei mir (Windows7 32bit) um Faktor 2,5 schneller als LazIntfImage ist. Hätte ich nicht gedacht. Vielleicht geht es aber noch besser umzusetzen - k.A.

Beispiele anbei.

Mathias hat geschrieben:Wen ich die Unit zu einem DatenType suche, mache ich dies meistens mit Google.
Das geht mMn mit den Lazarus-Bordmitteln schon schneller. Einfach das Package Cody installieren und schon kann man bei jedem nicht gefundenen Bezeichner per Rechtsklick auf die Fehlermeldung im Message-Fenster den Bezeichner per Cody suchen lassen (geht Ruckzuck - nicht mit der Suche "Bezeichner Suchen" vergleichbar).
Dateianhänge
AbdunkelnLazIntfImage.zip
(263.45 KiB) 104-mal heruntergeladen
AbdunkelnBGRABitmap.zip
(263.34 KiB) 101-mal heruntergeladen

Code: Alles auswählen

type
  TLiveSelection = (lsMoney, lsChilds, lsTime);
  TLive = Array[0..1] of TLiveSelection; 

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

Re: JPG oder PNG mit anderen Farben mischen

Beitrag von Mathias »

Habe mich mal zu einem Vergleich hinreisen lassen und stelle erstaunt fest, dass BGRABitmap bei mir (Windows7 32bit) um Faktor 2,5 schneller als LazIntfImage ist.

Das kann ich mir gut vorstellen, bei LazIntfImage hat jede Farbe 16Bit, bei BGRABitmap nur 8Bit, so wie TBitmap das auch ist. Da entfällt schlussendlich das umrechnen auf das TBitmap-Format.
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot

Benutzeravatar
Roland Chastain
Beiträge: 156
Registriert: Sa 7. Jul 2012, 21:50
Wohnort: Saargemünd
Kontaktdaten:

Re: JPG oder PNG mit anderen Farben mischen

Beitrag von Roland Chastain »

Hallo!

Michl hat geschrieben:Beispiele anbei.


Sehr hübsch! Getestet mit diesem Bilde. :)

http://www.musees.strasbourg.eu/sites_e ... nature/de/
Zuletzt geändert von m.fuchs am Do 29. Okt 2015, 22:54, insgesamt 1-mal geändert.
Grund: Bild wegen möglicher Urheberrechtsprobleme entfernt
Petit poisson deviendra grand,
Pourvu que Dieu lui prête vie.

Benutzeravatar
Roland Chastain
Beiträge: 156
Registriert: Sa 7. Jul 2012, 21:50
Wohnort: Saargemünd
Kontaktdaten:

Re: JPG oder PNG mit anderen Farben mischen

Beitrag von Roland Chastain »

@Michl
Ich schreibe ein Tutorial (auf Französisch) über BGRABitmap. Könnte ich deinem Beispiel benutzen?

@m.fuchs
Danke und Entschuldigung. :oops:
Petit poisson deviendra grand,
Pourvu que Dieu lui prête vie.

Michl
Beiträge: 2505
Registriert: Di 19. Jun 2012, 12:54

Re: JPG oder PNG mit anderen Farben mischen

Beitrag von Michl »

Roland Chastain hat geschrieben:Ich schreibe ein Tutorial (auf Französisch) über BGRABitmap. Könnte ich deinem Beispiel benutzen?
Selbstverständlich! Ich melde nirgends Urheberrechte an, es sein denn, ich habe dies im Code vermerkt. Das ist hier im Forum bis auf bei zwei, drei Projekten, nirgends der Fall gewesen (habe ich dann jeweils oben in der Kopfzeile vermerkt). Du könntes auch das beigefügte Bild verwenden, ist ein Urlaubsfoto von mir und kein Urheberrecht darauf.

Code: Alles auswählen

type
  TLiveSelection = (lsMoney, lsChilds, lsTime);
  TLive = Array[0..1] of TLiveSelection; 

Benutzeravatar
Roland Chastain
Beiträge: 156
Registriert: Sa 7. Jul 2012, 21:50
Wohnort: Saargemünd
Kontaktdaten:

Re: JPG oder PNG mit anderen Farben mischen

Beitrag von Roland Chastain »

@Michl
Super! Danke.
Petit poisson deviendra grand,
Pourvu que Dieu lui prête vie.

Benutzeravatar
theo
Beiträge: 10497
Registriert: Mo 11. Sep 2006, 19:01

Re: JPG oder PNG mit anderen Farben mischen

Beitrag von theo »

Da mir das Ganze doch sehr nach Alphablending aussieht, will ich hier auch noch meinen Senf dazugeben.
Da ich BGRABitmap nicht gut kenne, habe ich die Demo mit meinem OpBitmap gemacht.
Es ist alles notwendige im Zip drin. Nur auspacken und project1 kompilieren. Auch das Hähnchen ist dabei. :wink:
Dateianhänge
opalpha.zip
(374.27 KiB) 99-mal heruntergeladen

Michl
Beiträge: 2505
Registriert: Di 19. Jun 2012, 12:54

Re: JPG oder PNG mit anderen Farben mischen

Beitrag von Michl »

Ich habe mal die Paint Geschwindigkeit gemessen, und es ist hier sogar noch schneller, als BGRABitmap, wobei ich das Übereinanderlegen zweier Bitmaps mit BGRA nicht getestet habe, sondern jedes mal selbst rechne. Auf jeden Fall läuft das Projekt hier - danke dafür.

Code: Alles auswählen

type
  TLiveSelection = (lsMoney, lsChilds, lsTime);
  TLive = Array[0..1] of TLiveSelection; 

Benutzeravatar
theo
Beiträge: 10497
Registriert: Mo 11. Sep 2006, 19:01

Re: JPG oder PNG mit anderen Farben mischen

Beitrag von theo »

Michl hat geschrieben:Ich habe mal die Paint Geschwindigkeit gemessen, und es ist hier sogar noch schneller, als BGRABitmap, wobei ich das Übereinanderlegen zweier Bitmaps mit BGRA nicht getestet habe, sondern jedes mal selbst rechne. Auf jeden Fall läuft das Projekt hier - danke dafür.

Danke fürs testen.
Ja, viel schneller wird es wohl kaum gehen (ausser evtl. mit OpenGL etc.).
Es ist alles vorbereitet und wird durch OpBitmapPaint32A in OnPaint nur noch rausgehauen.
Das Blending übernimmt das Widget Set.
Win, GTK2 und Qt sind gemacht. Für Mac müsste man die entspr. Funktion noch schreiben.

Benutzeravatar
theo
Beiträge: 10497
Registriert: Mo 11. Sep 2006, 19:01

Re: JPG oder PNG mit anderen Farben mischen

Beitrag von theo »

Ein Bisschen was kann man noch rausholen, wenn man nur teilweise "invalidiert".

Code: Alles auswählen

uses LCLIntf;      
.....
fLastRect:TRect; 
.....
procedure TForm1.FormCreate(Sender: TObject);
begin
  DoubleBuffered := True;
  fMoving := CreateAndLoadOpBitmap('maske.png');
  opimglib.BlackToAlpha(fMoving);
  OpBitmapPreMultiply(fMoving, fMoving);
  fBack := CreateAndLoadOpBitmap('loue.jpg');
  Width := fBack.Width;
  Height := fBack.Height;
  fX:=0;
  fY:=0;
  fLastRect:=Rect(0,0,fMoving.Width,fMoving.Height);
end;
.....
procedure TForm1.FormMouseMove(Sender: TObject; Shift: TShiftState; X, Y: integer);
var R, Ru:TRect;
begin
  fX := X - (fMoving.Width div 2);
  fY := Y - (fMoving.Height div 2);
  R:=Rect(fX,fY,fX+fMoving.Width,fY+fMoving.Height);
  UnionRect(Ru,R,fLastRect);
  InvalidateRect(Handle,@Ru,true);
  fLastRect:=R;
end;   

mse
Beiträge: 2013
Registriert: Do 16. Okt 2008, 10:22
OS, Lazarus, FPC: Linux,Windows,FreeBSD,(MSEide+MSEgui 4.6,git master FPC 3.0.4,fixes_3_0)
CPU-Target: x86,x64,ARM

Re: JPG oder PNG mit anderen Farben mischen

Beitrag von mse »

Vielleicht interessiert es ja den Einen oder Anderen.
Ich habe versucht entsprechende Effekte mit MSEgui Bordmitteln zu realisieren.
Das Abdunkeln bei Mauskontakt ist ohne Code lediglich mit setzen von Eigenschaften möglich:
imagedarkening1.png
imagedarkening1.png (45.62 KiB) 2536 mal betrachtet

imagedarkening2.png
imagedarkening2.png (26.33 KiB) 2536 mal betrachtet

https://gitlab.com/mseuniverse/mseunive ... edarkening
Zur Animation braucht es etwas Handarbeit:

Code: Alles auswählen

 
const
 fps = 20;
 animtime = 0.3; //seconds
 opacitystep = 1/(animtime*fps);
 
procedure tmainfo.createexe(const sender: TObject);
begin
 timer.interval:= round(1000000 / fps); //micro seconds
end;
 
procedure tmainfo.timerexe(const sender: TObject);
begin
 if fup then begin
  fopacity:= fopacity + opacitystep;
  if fopacity > 1 then begin
   fopacity:= 1;
   timer.enabled:= false;
  end;
 end
 else begin
  fopacity:= fopacity - opacitystep;
  if fopacity < 0 then begin
   fopacity:= 0;
   timer.enabled:= false;
  end;
 end;
 image.face.fade_opacity:= opacitycolor(fopacity);
end;
 
procedure tmainfo.clientmouseexe(const sender: twidget;
               var ainfo: mouseeventinfoty);
begin
 case ainfo.eventkind of
  ek_clientmouseenter: begin
   fup:= true;
   timer.enabled:= true;
  end;
  ek_clientmouseleave: begin
   fup:= false;
   timer.enabled:= true;
  end;
 end;
end;
 

http://mseide-msegui.sourceforge.net/pi ... danim.mpeg
https://gitlab.com/mseuniverse/mseunive ... danimation

Ein etwas komplexeres Mauskontakt Beispiel, ebenfalls ohne Code realisierbar:
http://mseide-msegui.sourceforge.net/pi ... blend.mpeg
https://gitlab.com/mseuniverse/mseunive ... imageblend

Überblendung an Mauszeiger gebunden braucht lediglich eine Zeile Code:

Code: Alles auswählen

 
procedure tmainfo.childmouseeventexe(const sender: twidget;
                                                  var ainfo: mouseeventinfoty);
begin
 image.face.image.center:= TranslateWidgetToPaintPoint(ainfo.pos,sender,image);
end;
 

http://mseide-msegui.sourceforge.net/pics/blend.mpeg
https://gitlab.com/mseuniverse/mseunive ... s/blendpos

Die Beispiele benötigen die MSEide+MSEgui git master Version:
https://gitlab.com/mseide-msegui/mseide-msegui

Antworten