JPG oder PNG mit anderen Farben mischen

Für Probleme bezüglich Grafik, Audio, GL, ACS, ...
ConcAPPtLab
Beiträge: 89
Registriert: Fr 18. Apr 2014, 18:57

JPG oder PNG mit anderen Farben mischen

Beitrag von ConcAPPtLab »

Hallo,

ich möchte gerne ein Bild (JPG oder PNG) mit einer anderen Farbe mischen. Hintergrund ist, dass wenn der User mit der Maus über ein Bild hovert, dieses abgedunkelt wird (wenn möglich mit Animation, Überfaden). Mein Code bisher sieht so aus:

Code: Alles auswählen

 function TForm1.MixByteColor(Val1, Val2: byte; blend: real): byte;
begin
  result:=Round(Val1*(1-blend)+Val2*blend);
end;
 
procedure TForm1.Button1Click(Sender: TObject);
var x, y, byte: integer;
    blend: real=0.8;
    p: ^TPixArray;
    byteCol: TByteColor;
begin
 
  try
 
    Image1.Picture.LoadFromFile('pics/offers/album.jpg');
 
    { Set Color 2 }
      byteCol[1]:=0;           // b
      byteCol[2]:=0;           // g
      byteCol[3]:=0;           // r
 
    for y:=Image1.Height-1 downto 0 do
      begin
 
        p:=Image1.Picture.Bitmap.ScanLine[y];
 
        if y>Image1.Height*0.15 then
          blend:=0.8
        else if blend<0 then
          blend:=0
        else if blend<>0 then
          blend:=blend-(blend/(y+1));
 
        for x:=0 to Image1.Width-1 do
          begin
 
            for byte:=1 to 3 do
              begin
 
                p^[byte]:=MixByteColor(p^[byte], byteCol[byte], blend);
 
              end;
 
            Inc(p);
 
          end;
 
      end;
 
  finally
 
  end;
 
end;


Image1 ist auf Stretch=true gestellt.

Es passiert auch etwas, jedoch sieht das Ergebnis nicht wie gewünscht aus (siehe Anhang). Eigentlich sollte der Farbverlauf schwarz sein (nicht grau) und über das gesamte Bild gehen.

Weiß jemand ne Lösung dafür?

Grüße
ConcAPPtLab
Dateianhänge
Screenshot_2.png
Screenshot_2.png (65.04 KiB) 2723 mal betrachtet
Definition "Strategische Fehlerkorrektur":
Solange rumprobieren bisses klappt :D

Mathias
Beiträge: 6162
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 »

Ich würde dieses Wiki angucken, ich hoffe damit wirst du eine Lösung finden.

http://wiki.freepascal.org/BGRABitmap/de

Mit TBitmap ist man recht schnell am Anschlag.
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 »

Dank dir noch einmal. Ich werde mich mal einlesen :)
Definition "Strategische Fehlerkorrektur":
Solange rumprobieren bisses klappt :D

LazProgger
Beiträge: 63
Registriert: Di 11. Mär 2014, 00:33

Re: JPG oder PNG mit anderen Farben mischen

Beitrag von LazProgger »

Darf man das BGRA Bitmap denn in jeder closed source Anwendung verwenden oder muss man dafür lizenztechnisch die gesamte Anwendung OpenSource machen?

BGRA ist ja zunächst nicht in Lazarus vorinstalliert...

Mathias
Beiträge: 6162
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 »

Lizenz
modified LGPL

Was das auch immer heisst.

Steht fast zuunterst bei der Wiki.
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot

LazProgger
Beiträge: 63
Registriert: Di 11. Mär 2014, 00:33

Re: JPG oder PNG mit anderen Farben mischen

Beitrag von LazProgger »

Das ist eben die Frage was das heißt...

Das wäre vielleicht vorher gut zu wissen ob man das überhaupt für seinen Zweck verwenden kann..

LazProgger
Beiträge: 63
Registriert: Di 11. Mär 2014, 00:33

Re: JPG oder PNG mit anderen Farben mischen

Beitrag von LazProgger »

http://forum.lazarus.freepascal.org/ind ... ic=15944.0

Soweit ich das verstehe ist es kein Problem..

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

Re: JPG oder PNG mit anderen Farben mischen

Beitrag von theo »

Dafür braucht man keine externe Library. RTFM reicht. :wink:
Hier steht wie das geht:
http://wiki.freepascal.org/Developing_w ... blenden.22
Muss man nur noch anpassen.

EDIT
@ConcAPPtLab:
Wenn du Code Schnippsel einstellst, achte bitte darauf, dass sie vollständig sind.
Ohne zu wissen wie TPixArray und TByteColor definiert sind, kann man deinen Code genau genommen gar nicht lesen.

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

Re: JPG oder PNG mit anderen Farben mischen

Beitrag von ConcAPPtLab »

@theo: ups, sorry. Hab ich übersehen.

Code: Alles auswählen

TPixArray = array[1..3] of Byte;
 
  TByteColor = array[1..3] of Byte;


Sind zwar beide gleich, aber das eine ist aus einem Tutorial übernommen, das andere hab ich selbst gemacht. Haben beide unterschiedliche Funktionen, deswegen heißen sie anders (um es logischer zu machen).

Ich wollte zwar erst einmal noch ein wenig mit der BGRBitmap rumprobieren, bevor ich hier wieder einen Post schreibe (bin bisher noch nicht dazu gekommen), aber ich habe ein Problem. Und zwar habe ich versucht das hier aus dem Wikipedia Turorial (http://wiki.freepascal.org/BGRABitmap/de) zu programmieren:

Code: Alles auswählen

var 
   bmp: TBGRABitmap;
   p: PBGRAPixel;
   n: integer;
 
begin
     bmp := TBGRABitmap.Create('image.png');
     p := bmp.Data;
     for n := bmp.NbPixels-1 downto 0 do
     begin
          p^.red := not p^.red//invertiert den roten Kanal
          inc(p);
     end;
     bmp.InvalidateBitmap//beachten Sie, dass wir direkt auf die Pixels zugegriffen haben
     bmp.Draw(Canvas,0,0,True);
     bmp.Free;
end;


Doch das wird gleich mit der Fehlermeldung, dass PBGRAPixel nicht bekannt sei abgebrochen. Durch Suchen in den Dateien habe ich herausgefunden, dass diese in der Includedatei bgrapixel.inc definiert ist. Also habe ich diese eingebunden. Trotzdem gleiche Fehlermeldung.
Jemand ne Idee, was ich falsch mache? Momentan habe ich alle Dateien und Ordner, die in der neuesten Zip Datei auf sourceforge (bgrabitmap8.7.zip) verfügbar waren in meinen Projektordner kopiert und die Unit BGRABitmap in meiner Unit eingebunden. Und dann kommt wie beschrieben die Fehlermeldung.

Aber ich werde mir auch mal theos Vorschlag ansehen.

Und an LazProgger: gut, dass du Diskussion eingebracht hast. Nur hatte ich vorausgesetzt, das etwas, was frei auf sourceforge und Wikipedia verfügbar ist, zumindest für die private Nutzung verwendbar ist, und genau das möchte ich nur.Trotzdem ein guter Einwurf!

Danke an euch für die bisherige Hilfe,
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 »

Ich denke ebenfalls, dass du für diese Aufgabe kein externes Package installieren musst.

ConcAPPtLab hat geschrieben:Momentan habe ich alle Dateien und Ordner, die in der neuesten Zip Datei auf sourceforge (bgrabitmap8.7.zip) verfügbar waren in meinen Projektordner kopiert und die Unit BGRABitmap in meiner Unit eingebunden.
So geht man allgemein nicht mit Packages vor. Du kannst das Package nach dem Runterladen einfach an einen Ort deiner Wahl kopieren (den Ort sollte man nicht mehr verändern, solange das Package in Lazarus installiert ist) und unter Package -> Package-Datei (.lpk) öffnen... die Packagedatei öffnen, kompilieren und installieren. Sobald du nun eine Komponente vom Package in dein Projekt einfügst, werden alle notwendigen Abhängigkeiten/Pfade automatisch für dein Projekt verfügbar gemacht.

Selbst wenn man dann später keine Komponenten vom Package im eigenen Projekt benötigt, aber Methoden/Bezeichner daraus, könnte man unter Projekt -> Projektinspektor -> [Add +] Button -> Neue Anforderung -> Das Package wählen und damit den Zugriff darauf ermöglichen (ohne irgendwelche Dateien aus dem Package in das Projektverzeichnis zu kopieren).

Code: Alles auswählen

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

Mathias
Beiträge: 6162
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 »

Ich würde auf jeden Fall die lpk installieren.
Am Anfang hatte ich es auch ohne probiert und somit hatte ich mehrere Fehler. :wink:
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 »

Dankeschön, von Packages habe ich noc keine Ahnung gehabt.

Aber welches package soll ich installieren? Es werden ja gleich 5 geliefert
Definition "Strategische Fehlerkorrektur":
Solange rumprobieren bisses klappt :D

Mathias
Beiträge: 6162
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 »

Aber welches package soll ich installieren?

Nimm die bgrabitmappack.lpk, die war schon immer dabei, die anderen 4 sind erst kürzlich dazu gekommen, werde aber im Normalfall nicht gebraucht.
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 »

In Ordnung. Habe alles in das Verzeichnis lazarus -> components -> bgrabitmap_co kopiert.

In meinem Projekt bin ich dann auf Package -> Package-Datei (.lpk) öffnen gegangen. Habe einmal die bgrabitmappack.lpk geöffnet und kompiliert (erfolgreich beendet) und dann wollte ich sie installieren. Hat aber nicht geklappt. Ich konnte nämlich Nutzung... -> Installieren nicht auswählen, sondern nur Nutzung... -> zum Projekt hinzufügen. Und das hat nicht dazu beigetragen, dass PBGRAPixel bekannt ist...

Auch eine Neuinstallation von Lazarus hat nicht geholfen (ich verwende Lazarus 1.2.4 für Win64).

Irgendeine Idee, wieso das nicht geht?
Definition "Strategische Fehlerkorrektur":
Solange rumprobieren bisses klappt :D

Mathias
Beiträge: 6162
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 »

sondern nur Nutzung... -> zum Projekt hinzufügen.

Wen das erledigt ist, dann öffne den Projektinspektor.
Dort Add>> -> neue Anforderung. Evtl. unter Windows heisst es Hinzufügen... -> neue Anforderung.

Package-Name, dort sollte BGRABitmapPack vorhanden sein.
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot

Antworten