RGB trennen und jeweils den gewünschten kanal als grau

Für allgemeine Fragen zur Programmierung mit PureBasic.
xxfreshman
Beiträge: 2
Registriert: 26.08.2020 07:11

RGB trennen und jeweils den gewünschten kanal als grau

Beitrag von xxfreshman »

Ich habe eine Prozedur geschrieben die ein Image reingegeben bekommen soll und je nach gadget auswahl jeweils rot grün oder blau als graues bild zurück geben soll, die routiene läuft eigentlich auch so weit, aber halt nicht immer, gibt es denn keine bessere variante? Könnte mir jemand von euch helfen? Vielen Dank.

Code: Alles auswählen

Procedure UseFilter(TF_Image)
  IMX=ImageWidth(TF_Image)
  IMY=ImageHeight(TF_Image) 
  IMD=ImageDepth(TF_Image)
  ;If Endpic.i=CreateImage(#PB_Any,IMX,IMY,IMD)
  If CreateImage(101,IMX,IMY,IMD)
    StartDrawing(ImageOutput(101))
    DrawingMode(#PB_2DDrawing_CustomFilter)
    If GetGadgetState(19)=1
      CustomFilterCallback(@RedFilter())
    EndIf
    If GetGadgetState(19)=2
      CustomFilterCallback(@GreenFilter())
    EndIf
    If GetGadgetState(19)=3
      CustomFilterCallback(@BlueFilter())
    EndIf
    If GetGadgetState(19)=4
      CustomFilterCallback(@RGBFilter())
    EndIf
    DrawImage(ImageID(TF_Image), 0, 0) 
    StopDrawing()
    ;SaveImage(101, DirectoryEntryName(0)+"Red.png",#PB_ImagePlugin_PNG)
    ;FreeImage(101)
  EndIf
  BF_Image=CopyImage(101,#PB_Any)
  FreeImage(TF_Image)
  FreeImage(101)
  ProcedureReturn (BF_Image)
  
EndProcedure
Benutzeravatar
STARGÅTE
Kommando SG1
Beiträge: 7035
Registriert: 01.11.2005 13:34
Wohnort: Glienicke
Kontaktdaten:

Re: RGB trennen und jeweils den gewünschten kanal als grau

Beitrag von STARGÅTE »

Hallo xxfreshman,
willkommen im Forum.

Da du keinen ausführbaren Code gepostet hast, kann ich/wir dir kaum helfen.
Was bedeutet "aber halt nicht immer"?
"gibt es denn keine bessere variante?" Das du CustomFilterCallback() verwendest ist der richtige Weg.
Vielleicht zeigst du noch, wass in deinen Callback-Prozeduren steht?
PB 6.01 ― Win 10, 21H2 ― Ryzen 9 3900X, 32 GB ― NVIDIA GeForce RTX 3080 ― Vivaldi 6.0 ― www.unionbytes.de
Aktuelles Projekt: Lizard - Skriptsprache für symbolische Berechnungen und mehr
xxfreshman
Beiträge: 2
Registriert: 26.08.2020 07:11

Re: RGB trennen und jeweils den gewünschten kanal als grau

Beitrag von xxfreshman »

Hier die callback routine :-)

Code: Alles auswählen

Procedure RedFilter(x, y, QuellFarbe, ZielFarbe)
  ProcedureReturn RGBA(Red(QuellFarbe), Red(QuellFarbe), Red(QuellFarbe), Alpha(QuellFarbe))
EndProcedure

Procedure GreenFilter(x, y, QuellFarbe, ZielFarbe)
  ProcedureReturn RGBA(Green(QuellFarbe), Green(QuellFarbe), Green(QuellFarbe), Alpha(QuellFarbe))
EndProcedure

Procedure BlueFilter(x, y, QuellFarbe, ZielFarbe)
  ProcedureReturn RGBA(Blue(QuellFarbe), Blue(QuellFarbe), Blue(QuellFarbe), Alpha(QuellFarbe))
EndProcedure

Procedure RGBFilter(x, y, QuellFarbe, ZielFarbe)
  trgb=Round ((Red(QuellFarbe)+Green(QuellFarbe)+Blue(QuellFarbe))/3,#PB_Round_Nearest)
  ProcedureReturn RGBA(trgb, trgb, trgb, trgb)
EndProcedure
Ich habe das problem das wenn ich nun das ausgangsbild einmal resize für den Bildschirm und das original abschpeicher das komischerweise das Graue bild auf dem bildschirm angezeigt wird, aber abgespeichert wird immer noch ein farbiges, wenn aber der code oben so richtig ist dann weiss ich das ich woanders suchen muss.

Vielen Dank
Benutzeravatar
STARGÅTE
Kommando SG1
Beiträge: 7035
Registriert: 01.11.2005 13:34
Wohnort: Glienicke
Kontaktdaten:

Re: RGB trennen und jeweils den gewünschten kanal als grau

Beitrag von STARGÅTE »

"einmal resize für den Bildschirm" was meinst du damit?

Deine Problembeschreibung klingt fast so, als vermischst du die Image-Nummern, und wie ich sehe, verwendest du ja auch in der Procedure eine feste Nummer (101), was in sofern gefährlich ist, wenn du diese auch im Hauptprogramm (ausversehen) verwendest.

Vielleicht kannst du das Problem auf einen ausführbaren Code reduzieren, damit ich/wir es selber testen können.
Ansonsten können wir nur Vermutungen anstellen.
PB 6.01 ― Win 10, 21H2 ― Ryzen 9 3900X, 32 GB ― NVIDIA GeForce RTX 3080 ― Vivaldi 6.0 ― www.unionbytes.de
Aktuelles Projekt: Lizard - Skriptsprache für symbolische Berechnungen und mehr
Antworten