Seite 1 von 1

Transparent-Color eines PNG verstellen bzw einstellen.

Verfasst: 21.02.2013 20:35
von DrShrek
Hallo,

Habe ein PNG welches keine Transparent Color beinhaltet.
Die Background Farbe ist RGB(255,255,255). Das Farbe möchte ich gerne als Transparent-Color definieren und dann das PNG wieder abspeichern. Habt Ihr eine Idee wie ich das mit PureBasic anstellen kann?

Re: Transparent-Color eines PNG verstellen bzw einstellen.

Verfasst: 27.02.2013 14:59
von Thorium
Als Datei öffnen und Chunk hinzufügen.
Hier findest du die nötigen Infos übers Dateiformat: http://www.libpng.org/pub/png/

Re: Transparent-Color eines PNG verstellen bzw einstellen.

Verfasst: 27.02.2013 15:43
von ts-soft

Code: Alles auswählen

EnableExplicit

UsePNGImageDecoder()
UsePNGImageEncoder()

Procedure CustomCallback(x, y, QuellFarbe, ZielFarbe)
  If QuellFarbe = RGBA(255, 255, 255, 255)
    ProcedureReturn RGBA(255, 255, 255, 0)
  Else
    ProcedureReturn QuellFarbe
  EndIf
EndProcedure

Define.s File

File = OpenFileRequester("", "", "", 0)
If File
  If LoadImage(0, File)
    If CreateImage(1, ImageWidth(0), ImageHeight(0), 32)
      StartDrawing(ImageOutput(1))
        DrawingMode(#PB_2DDrawing_CustomFilter)
        CustomFilterCallback(@CustomCallback())
        DrawAlphaImage(ImageID(0), 0, 0)
      StopDrawing()
      File = SaveFileRequester("", "", "", 0)
      If File
        SaveImage(1, File, #PB_ImagePlugin_PNG)
      EndIf
    EndIf
  EndIf
EndIf
Damit auch "schmutziges" weiß berücksichtigt wird, ist das If im Callback entsprechend zu erweitern.

Hier noch ein kleines Beispiel. Hab den Hintergrund des Fensters auf Blau gesetzt, damit man es besser
erkennt :wink:

Code: Alles auswählen

EnableExplicit

Define.s File = GetTemporaryDirectory() + "Ok.png"

InitNetwork()
UsePNGImageDecoder()

Procedure CustomCallback(x, y, QuellFarbe, ZielFarbe)
  If QuellFarbe = RGBA(255, 255, 255, 255)
    ProcedureReturn RGBA(255, 255, 255, 0)
  Else
    ProcedureReturn QuellFarbe
  EndIf
EndProcedure

If FileSize(File) <= 0
  ReceiveHTTPFile("https://dl.dropbox.com/u/3086026/Ok.png", File)
EndIf

If LoadImage(0, File)
    If CreateImage(1, ImageWidth(0), ImageHeight(0), 32)
      StartDrawing(ImageOutput(1))
        DrawingMode(#PB_2DDrawing_CustomFilter)
        CustomFilterCallback(@CustomCallback())
        DrawAlphaImage(ImageID(0), 0, 0)
      StopDrawing()
    EndIf
    OpenWindow(0, #PB_Ignore, #PB_Ignore, 330, 170, "Transparent Test")
    SetWindowColor(0, $FF0000)
    ImageGadget(0, 10, 10, 150, 150, ImageID(0))
    ImageGadget(1, 170, 10, 150, 150, ImageID(1))
    While WaitWindowEvent() <> #PB_Event_CloseWindow : Wend
EndIf

Re: Transparent-Color eines PNG verstellen bzw einstellen.

Verfasst: 27.02.2013 19:43
von DrShrek
@ts-soft,
Dafür ein dickes Bussi. Hast Dir das echt verdient :oops:

Re: Transparent-Color eines PNG verstellen bzw einstellen.

Verfasst: 27.02.2013 20:11
von ts-soft
Solange Dir Perlweiß reicht, ist es ja gut. Ansonsten würde ich STARGÅTE mal anhauen, der
hat bestimmt auch eine Formel parat um schmutziges Weiß, also die kleinen häßlichen Ränder
zu berechnen.

Re: Transparent-Color eines PNG verstellen bzw einstellen.

Verfasst: 01.03.2013 14:48
von Thorium
Wobei Alphakanal und transparente Farbe streng genommen nicht das gleiche ist.
PNG unterstützt das definieren von Farben als Transparent ohne Alphakanal.