Tranparentes Image

Anfängerfragen zum Programmieren mit PureBasic.
Benutzeravatar
Velindos
Beiträge: 598
Registriert: 15.11.2010 10:56

Tranparentes Image

Beitrag von Velindos »

Hallo,
möchte mein Bild auf ein transparentes Image zeichnen. Funktioniert bis Dato nur mit schwarzen Hintergrund.
Also wenn ich "| #PB_Image_Transparent" einfüge, stürzt mein Compiler!

Code: Alles auswählen

Case #PopUpHorizontal; "Horizonatles Einfügen")
  If GetClipboardImage(#SaveImage)
    ResizeImage (#SaveImage,230,153)
    ;Bild Format festlegen
    breite=230
    hoehe=240
    ;Bild createt
    If CreateImage(#NeuesImage,breite,hoehe,32); Funktioniert
    ;If CreateImage(#NeuesImage,breite,hoehe,32| #PB_Image_Transparent defekt,); bei  | #PB_Image_Transparent defekt, Compiler stürzt ab
      If StartDrawing(ImageOutput(#NeuesImage))
        ;DrawingMode(#PB_2DDrawing_AlphaBlend)
        ;DrawAlphaImage(ImageID(#SaveImage),0,44,255);   [, KonstAlpha])
        DrawImage(ImageID(#SaveImage),0,44)
        ;DrawImage(CutImgCapture,0,0)
        StopDrawing()
        ;Image in Speicher schreiben
        *ImageMemory = SaveImageToMemory(#NeuesImage, @MemSize)
        ;Image aus Speicher lesen
        Img2 = CatchImage(#Img2, *ImageMemory, MemSize)
        SetGadgetState(#I_Bild, ImageID(#Img2))
      EndIf
    EndIf   
  EndIf
Hat jemand eine Ahnung wieso?
Gruss ... Velindos
Windows 7/8/8.1/10 (32/64-Bit) |Ubuntu 10.4 (64-Bit) |Purebasic 5.71 LTS (32/64-Bit)
Benutzeravatar
Kiffi
Beiträge: 10714
Registriert: 08.09.2004 08:21
Wohnort: Amphibios 9

Re: Tranparentes Image

Beitrag von Kiffi »

hier (PB4.6) stürzt nix ab. Allerdings musste ich Deinen
Code auch erst einmal anpassen, damit er bei mir läuft.

In Deinem Interesse: Bitte in Zukunft lauffähige
Schnippsel posten, damit potentielle Helfer es einfacher
haben, Dir eine Lösung anzubieten.

Code: Alles auswählen

#SaveImage=0
#NeuesImage=1

If GetClipboardImage(#SaveImage)
  
  ResizeImage (#SaveImage,230,153)
  
  breite=230
  hoehe=240
  
  ;If CreateImage(#NeuesImage,breite,hoehe,32) ; Funktioniert
  
  If CreateImage(#NeuesImage,breite,hoehe,32 | #PB_Image_Transparent) ; bei  | #PB_Image_Transparent defekt, Compiler stürzt ab
    If StartDrawing(ImageOutput(#NeuesImage))
      Debug "Hat geklappt!"
      DrawImage(ImageID(#SaveImage),0,44)
      StopDrawing()
    Else
      Debug "!StartDrawing"
    EndIf
  Else
    Debug "!CreateImage"
  EndIf   
  
Else
  Debug "!GetClipboardImage"
EndIf
Grüße ... Kiffi
a²+b²=mc²
Benutzeravatar
Velindos
Beiträge: 598
Registriert: 15.11.2010 10:56

Re: Tranparentes Image

Beitrag von Velindos »

Hallo Kiffi,
hab dir mal den Code reingegeben. Wenn du | #PB_Image_Transparent einfügst, verschwindet das ganze.

Code: Alles auswählen

;- Window Constants
Enumeration
  #FrameMain
EndEnumeration
;- Gadget Constants
Enumeration
  #B_Exit
  #B_Memory
  #I_Bild
  #I_Bild2
  #T_Text
  #S_PopUpBild
  #PopUpHorizontal
EndEnumeration
;-Image Constants
UseJPEGImageDecoder()
UseJPEGImageEncoder()
;-Image Constants
Enumeration
  #SaveImage
  #NeuesImage
  #Img2=1
  #Image
  #Image2
EndEnumeration
;-Glcbal Constans

Global MemSize
Global *ImageMemory
Global Img2 
Global Image2

;-Proceduren
Procedure SaveImageToMemory(Image, *MemSize, Format = #PB_ImagePlugin_JPEG, Compression = 9)
  Protected *Mem, MemSize, ImageDataPipe, PipeName$, RealMemSize
  PipeName$ = "\\.\pipe\ImageDataPipe_" + Str(GetCurrentThreadId_()) ; <- Threadsicher
  MemSize = ImageDepth(Image)*ImageHeight(Image)*ImageWidth(Image)
  *Mem = AllocateMemory(MemSize)
  ImageDataPipe = CreateNamedPipe_(PipeName$, #PIPE_ACCESS_INBOUND | #FILE_FLAG_OVERLAPPED, #PIPE_TYPE_BYTE | #PIPE_READMODE_BYTE | #PIPE_NOWAIT, 1, MemSize, MemSize, #NMPWAIT_USE_DEFAULT_WAIT, #Null)
  SaveImage(Image, PipeName$, Format, Compression)
  ReadFile_(ImageDataPipe, *Mem, MemSize, *MemSize, #Null)
  CloseHandle_(ImageDataPipe)
  ProcedureReturn *Mem
EndProcedure

;-Windows
OpenWindow(#FrameMain, 0, 0, 640, 480, "Tranparentes Image überzeichnen",  #PB_Window_SystemMenu | #PB_Window_SizeGadget | #PB_Window_TitleBar )
If CreatePopupMenu(#S_PopUpBild)
  MenuItem(#PopUpHorizontal, "Horizonatles Einfügen")
EndIf

ButtonGadget(#B_Exit,20,20,60,20,"EXIT")
ButtonGadget(#B_Memory,420,20,60,20,"Memory")
TextGadget(#T_Text,100,20,370,20,"Bild vorher kopieren und rechtsklick linkes Gadget Einfügen")
ImageGadget(#I_Bild, 20, 50, 230, 240, myDisplay, #PB_Image_Border)
ImageGadget(#I_Bild2, 270, 50, 230, 240, myDisplay, #PB_Image_Border)
;-Windows Start

;-Event´s
Repeat
  Select WaitWindowEvent()
    Case #PB_Event_CloseWindow: End
    Case #PB_Event_Gadget
      
      Select EventGadget()
          
          ;Case #B_Dateiladen: Open_Windows_1()
          ;Case #B_OpenDatei: OpenDatei()
          
        Case #B_Exit: End
          
        Case #I_Bild
          Select EventType()
            Case #PB_EventType_RightClick
              DisplayPopupMenu(#S_PopUpBild, WindowID(#FrameMain))
          EndSelect
          
        Case #B_Memory
          Img2 = CatchImage(#Image2, *ImageMemory, @MemSize) ;Variante 2
          SetGadgetState(#I_Bild2,img2) ; Variante 2
          
          
      EndSelect   
      
      ; Case für Menue
    Case #PB_Event_Menu
      Select EventMenu()
          ;- Bild UpHorizontal
        Case #PopUpHorizontal; "Horizonatles Einfügen")
          If GetClipboardImage(#SaveImage)
            ResizeImage (#SaveImage,230,153)
            breite=230
            hoehe=240
            ;1 Variante
            If CreateImage(#NeuesImage,breite,hoehe,32)
              ;If CreateImage(#NeuesImage,breite,hoehe,32| #PB_Image_Transparent) ; <===== wenn ich  funkt´s nicht mehr
              If StartDrawing(ImageOutput(#NeuesImage))
                Debug "Hat geklappt!"
                DrawImage(ImageID(#SaveImage),0,44)
                StopDrawing()
                *ImageMemory = SaveImageToMemory(#NeuesImage, @MemSize) 
                SetGadgetState(#I_Bild, ImageID(#NeuesImage))
              Else
                Debug "!StartDrawing"
              EndIf
            Else
              Debug "!CreateImage"
            EndIf   
          EndIf
      EndSelect
  EndSelect
ForEver
Gruss ... Velindos
Windows 7/8/8.1/10 (32/64-Bit) |Ubuntu 10.4 (64-Bit) |Purebasic 5.71 LTS (32/64-Bit)
Benutzeravatar
Kiffi
Beiträge: 10714
Registriert: 08.09.2004 08:21
Wohnort: Amphibios 9

Re: Tranparentes Image

Beitrag von Kiffi »

Velindos hat geschrieben:hab dir mal den Code reingegeben. Wenn du | #PB_Image_Transparent einfügst, verschwindet das ganze.
das ganze was verschwindet?

Bei mir erscheint dann zwar kein Bild im ImageGadget
aber zumindest kommt die Debug-Ausgabe 'Hat geklappt'.

Also: Bei mir kein Absturz des Programmes oder Verschwinden von was-auch-immer.

Grüße ... Kiffi
a²+b²=mc²
Benutzeravatar
bobobo
jaAdmin
Beiträge: 3873
Registriert: 13.09.2004 17:48
Kontaktdaten:

Re: Tranparentes Image

Beitrag von bobobo »

ff sollte es tun , frag mich aber nicht warum

Code: Alles auswählen

..
..
If CreateImage(#NeuesImage,breite,hoehe,32|#PB_Image_Transparent)
  If StartDrawing(ImageOutput(#NeuesImage))
    Debug "Hat geklappt!"
    DrawingMode(#PB_2DDrawing_AlphaBlend) ; HIER DAS HIER !! JUHUUU  
    DrawImage(ImageID(#SaveImage),0,44)
    StopDrawing()
    *ImageMemory = SaveImageToMemory(#NeuesImage, @MemSize) 
    SetGadgetState(#I_Bild, ImageID(#NeuesImage))
  Else
    Debug "!StartDrawing"
  EndIf
..
..

‮pb aktuel 6.2 windoof aktuell und sowas von 10
Ich hab Tinnitus im Auge. Ich seh nur Pfeifen.
c4s
Beiträge: 1235
Registriert: 19.09.2007 22:18

Re: Tranparentes Image

Beitrag von c4s »

DrawAlphaImage()?
"Menschenskinder, das Niveau dieses Forums singt schon wieder!" — GronkhLP ||| "ich hogffe ihr könnt den fehle endecken" — Marvin133 ||| "Ideoten gibts ..." — computerfreak ||| "Jup, danke. Gruss" — funkheld
Benutzeravatar
Velindos
Beiträge: 598
Registriert: 15.11.2010 10:56

Re: Tranparentes Image

Beitrag von Velindos »

Hallo,
danke für eure Vorschläge! Habe euere Vorschläge noch mit den Befehl

DrawAlphaImage(ImageID(#SaveImage),0,44)

ergänzt. Brachte aber auch kein transparentes Image.

Ist immer noch WEISS und nicht TRANSPARENT.
Gruss ... Velindos
Windows 7/8/8.1/10 (32/64-Bit) |Ubuntu 10.4 (64-Bit) |Purebasic 5.71 LTS (32/64-Bit)
Benutzeravatar
Bisonte
Beiträge: 2468
Registriert: 01.04.2007 20:18

Re: Tranparentes Image

Beitrag von Bisonte »

ähm ... schonmal dran gedacht auch ein bild mit transparenz zu nehmen ?
Ich komm grad drauf, weil du nur den JPEG Decoder aufrufst, aber nicht den PNG Decoder.
Von JPEG Bildern kannst Du keine Transparenz erwarten. Das geht nur mit dem PNG Format.
PureBasic 6.21 (Windows x86/x64) | Windows11 Pro x64 | AsRock B850 Steel Legend Wifi | R7 9800x3D | 64GB RAM | GeForce RTX 5080 | ThermaltakeView 270 TG ARGB | build by vannicom​​
Benutzeravatar
bobobo
jaAdmin
Beiträge: 3873
Registriert: 13.09.2004 17:48
Kontaktdaten:

Re: Tranparentes Image

Beitrag von bobobo »

Quackerlatütt ! :mrgreen:

Ein Image wird alphakanalig im Speicher erzeugt (Z.B. Hinterngrund und darüberliegende durchsichtige Teile)
und kann sonstwie abgespeichert werden.

Das gespeicherte Bild enthält dann natürlich keine Transparenz mehr (bzw. abhängig vom Format)

Code: Alles auswählen

If CreateImage(0,400,400,32|#PB_Image_Transparent)
  StartDrawing(ImageOutput(0))
    Box(0,0,400,400,RGB(128,255,128))
    DrawingMode(#PB_2DDrawing_AlphaBlend|#PB_2DDrawing_Transparent)
    Box(20,20,200,200,RGBA(200,100,100,64))
    Box(10,10,200,200,RGBA(255,128,128,128))
    For i=1 To 400 Step 20
      DrawText(0,i,"RoibaHozznPlozz",RGBA(32,32,128,i))
    Next i
  StopDrawing()
  If SaveImage(0,GetTemporaryDirectory()+"dbm.bmp")
    If RunProgram(GetTemporaryDirectory()+"dbm.bmp") =0
    Else
      Delay(2000)
    EndIf
  EndIf
EndIf
‮pb aktuel 6.2 windoof aktuell und sowas von 10
Ich hab Tinnitus im Auge. Ich seh nur Pfeifen.
Benutzeravatar
Velindos
Beiträge: 598
Registriert: 15.11.2010 10:56

Re: Tranparentes Image

Beitrag von Velindos »

Hallo Leute,
besten Dank für eure Tips, habe sie in die Lösung eingearbeitet. Letzteren geht ein transparentes Image nur im Format *.PNG. Des nächsten habe ich das in Procedure geändert. Hiier die korriegerte Version:

Code: Alles auswählen

;- Window Constants
Enumeration
  #FrameMain
EndEnumeration
;- Gadget Constants
Enumeration
  #B_Exit
  #B_Memory
  #B_ClearBild
  #I_Bild
  #I_Bild2
  #T_Text
  #S_PopUpBild
  #PopUpHorizontal
EndEnumeration
;-Image Constants
UsePNGImageDecoder()
UsePNGImageEncoder()
UseJPEGImageDecoder()
UseJPEGImageEncoder()
;-Image Constants
Enumeration
  #SaveImage
  #NeuesImage
  #Img2=1
  #Image
  #Image2
EndEnumeration
;-Glcbal Constans

Global MemSize
Global *ImageMemory
Global Img2 
Global Image2

;-Proceduren
Procedure SaveImageToMemory(Image, *MemSize, Format = #PB_ImagePlugin_PNG, Compression = 7) ;<=== Hier muss PNG rein
  Protected *Mem, MemSize, ImageDataPipe
  MemSize = ImageDepth(Image)*ImageHeight(Image)*ImageWidth(Image)
  *Mem = AllocateMemory(MemSize)
  ImageDataPipe = CreateNamedPipe_("\\.\pipe\ImageDataPipe", #PIPE_ACCESS_INBOUND | #FILE_FLAG_OVERLAPPED, #PIPE_TYPE_BYTE | #PIPE_READMODE_BYTE | #PIPE_NOWAIT, 1, MemSize, MemSize, #NMPWAIT_USE_DEFAULT_WAIT, #Null)
  SaveImage(Image, "\\.\pipe\ImageDataPipe", Format, Compression)
  ReadFile_(ImageDataPipe, *Mem, MemSize, *MemSize, #Null)
  CloseHandle_(ImageDataPipe)
  ProcedureReturn *Mem
EndProcedure

;-Windows
OpenWindow(#FrameMain, 0, 0, 640, 480, "Tranparentes Image überzeichnen",  #PB_Window_SystemMenu | #PB_Window_SizeGadget | #PB_Window_TitleBar )
If CreatePopupMenu(#S_PopUpBild)
  MenuItem(#PopUpHorizontal, "Horizonatles Einfügen")
EndIf

ButtonGadget(#B_Exit,490,20,60,20,"EXIT")
ButtonGadget(#B_Memory,420,20,60,20,"Memory")
ButtonGadget(#B_ClearBild,20,20,60,20,"Clear")

TextGadget(#T_Text,100,20,320,20,"Bild kopieren und mit Rechtsklick ins linke Gadget Einfügen")
ImageGadget(#I_Bild, 20, 50, 230, 240, myDisplay, #PB_Image_Border)
ImageGadget(#I_Bild2, 270, 50, 230, 240, myDisplay, #PB_Image_Border)
;-Windows Start

;-Event´s
Repeat
  Select WaitWindowEvent()
    Case #PB_Event_CloseWindow: End
    Case #PB_Event_Gadget
      
      Select EventGadget()
          
          ;Case #B_Dateiladen: Open_Windows_1()
          ;Case #B_OpenDatei: OpenDatei()
          
        Case #B_Exit: End
          
        Case #I_Bild
          Select EventType()
            Case #PB_EventType_RightClick
              DisplayPopupMenu(#S_PopUpBild, WindowID(#FrameMain))
          EndSelect
          
        Case #B_Memory
          Img2 = CatchImage(#Image2, *ImageMemory, @MemSize) ;Variante 2
          SetGadgetState(#I_Bild2,img2) ; Variante 2
          SetClipboardImage(#I_Bild2)
          
        Case #B_ClearBild
          Global NeuesImage=CreateImage(#NeuesImage,230,240,32|#PB_Image_Transparent )
          SetGadgetState(#I_Bild, ImageID(#NeuesImage))
      EndSelect   
      
      ; Case für Menue
    Case #PB_Event_Menu
      Select EventMenu()
          ;- Bild UpHorizontal
        Case #PopUpHorizontal; "Horizonatles Einfügen")
          If GetClipboardImage(#SaveImage)
            ResizeImage (#SaveImage,230,153)
            breite=230
            hoehe=240
            ;1 Variante
            If CreateImage(#NeuesImage,breite,hoehe,32|#PB_Image_Transparent )
              If StartDrawing(ImageOutput(#NeuesImage))
                Debug "Hat geklappt!"
                DrawingMode(#PB_2DDrawing_AlphaBlend) ; HIER DAS HIER !! JUHUUU 
               DrawAlphaImage(ImageID(#SaveImage),0,44)
               ;* DrawImage(ImageID(#SaveImage),0,44)
                StopDrawing()
                *ImageMemory = SaveImageToMemory(#NeuesImage, @MemSize)
                
                SetGadgetState(#I_Bild, ImageID(#NeuesImage))
              Else
                Debug "!StartDrawing"
              EndIf         
            EndIf
          EndIf
          
        EndSelect
    EndSelect
  ForEver
PS.: Das mit der "Compression = 7" ist mir noch nicht ganz klar!
Gruss ... Velindos
Windows 7/8/8.1/10 (32/64-Bit) |Ubuntu 10.4 (64-Bit) |Purebasic 5.71 LTS (32/64-Bit)
Antworten