Seite 1 von 1

RGB trennen und jeweils den gewünschten kanal als grau

Verfasst: 26.08.2020 07:20
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

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

Verfasst: 26.08.2020 09:14
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?

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

Verfasst: 26.08.2020 09:36
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

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

Verfasst: 27.08.2020 22:59
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.