Seite 1 von 1

Laden, verändern, speichern von Icon-Files ist fehlerhaft

Verfasst: 01.04.2007 11:20
von sharkpeter
Hallo Leute,

Unter anderem durch ein eigenes Projekt sowie nebenbei auch durch dieses Thema
http://www.purebasic.fr/german/viewtopi ... light=icon
habe ich mich letzte Woche und gestern gemeinsam mit Falko und Donald ein wenig mit
dem Thema auseinander gesetzt. Dabei sind wir zu folgendem Fazit gekommen:

- Laden des File in ein Image: #True

- Anzeige des Image in einem ButtonImage oder ImageGadget: #True

- Größenänderung des Image: #False

- speichern des Image in einem neuen File: #False

Donald kam auf die Idee, es mal über das Clipboard zu versuchen, also
das Image erst einmal dort abzulegen und dann wieder zu laden und dann
erst zu ändern oder zu speichern. Das wiederum funktioniert.

Falko hatte einige andere Ideen, die auch funktionieren.

Ich habe selbst auch ein paar Wege entwickelt es als "richtiges" Image
zu laden und dann zu verarbeiten, das ist aber nicht der Punkt, sondern
stehe ich auf dem Standpunkt: BUG

Warum? Kann ich es laden, sollte ich es auch verarbeiten können.

Hier ist mal ein Testcode dazu.

Code: Alles auswählen

; Testprogramm laden und ändern und speichern Icon-Files

; Hallo Falko, lass das Ding erst mal so laufen, ohne die Resize
; Dann mach das mal aktiv, da siehst du was ich meine.
; Das mit dem Speichern siehst du gleich beim Beenden.

; Donald´s Idee mit dem Clipboard nachträglich eingefügt.

  file.s=OpenFileRequester("Laden","c:\","Symboldateien (*.ico)|*.ico",0)

  If Right(file,4)<>".ico"   : End: EndIf  
  If LoadImage(0,file): Else: End: EndIf


  ; zuerst nur bei Resize die Auskommentierung entfernen
  ; dann auch hier, da geht es dann plötzlich

;   SetClipboardImage(0)
;   GetClipboardImage(0) 

  ; wenn das Bild vorher nicht in die Zwischenablage kommt,
  ; gibt es weiter unten einen Fehler und das Bild wird auch
  ; nicht gespeichert.

;    If ResizeImage(0,150,150)
;    Else
;      MessageRequester("Nein, nein","")
;    EndIf

; Fenster
If OpenWindow(0,0,0,200,100,"Test",#PB_Window_ScreenCentered|#PB_Window_SystemMenu)
  If CreateGadgetList(WindowID(0))
    ImageGadget(0,10,10,1,1,ImageID(0))
    Repeat
    Until WaitWindowEvent()=#PB_Event_CloseWindow
  EndIf
EndIf

; versuchen zu speichern
temp.s=GetTemporaryDirectory()+"savediconfile.bmp"
If SaveImage(0,temp)
Else
  MessageRequester("nicht gespeichert","")
EndIf

End
Edit//:
- Das man kein Icon als solches speichern kann ist klar, dafür gibt es
ja kein Plugin.
- bei Windows9x wird gar nicht resized
- bei XP wird wohl resized, aber das Image ist dann schwarz

Gruß Jens

Verfasst: 01.04.2007 19:47
von Falko
Hallo Jens,
anscheinend denken hier alle das wäre ein Aprilscherz.
Aber nun im Ernst, hat jemand mal den Source ausprobiert und die
kommentierten Funktionen von oben nach unten nach und nach
mal auskommentiert?

Mit BMP, JPEG usw. funktioniert das Resizen, aber von ico kommt kein
Handle. Nur wenn man das Clipboard (Tip von Donald) gleich nach dem Laden benutzt wird wohl ein Handle vom Icon erzeugt, sodas man danach
das Bild mit ImageID mittels Resize verändern kann und auch korrekt
angezeigt bekommt. Läßt man es weg, wird kein Bild angezeigt, sondern
unter XP nur ein schwarzer Hintergrund sehen. Bei Win9x kommt sogar lustigerweise eine Systemfehlermeldung.

Scheint wohl ein Bug zu sein, oder was denkt ihr?

Gruß Falko

Verfasst: 01.04.2007 20:04
von DarkDragon
Habs mal im englischen Forum geschrieben.

http://www.purebasic.fr/english/viewtop ... highlight=

Bin nur zu müde ums auch in korrektem Englisch und länger zu formulieren.

Verfasst: 28.04.2007 19:45
von sharkpeter
Also es war kein Aprilscherz, jetzt wo fast Mai ist will ich es mal auflösen.

Habe mir inzwischen was einfallen lassen für den IconMaker, der ist jetzt
auch Online.

Und doch bin ich der Meinung, auch wenn im englischen Forum was anderes
dazu steht: Ich kann´s aufmachen und in ein PB-Image laden, warum
in Gottes Namen soll ich es nicht auch weiterverarbeiten und speichern
können.

Gruß Jens

Verfasst: 28.04.2007 23:27
von ts-soft
sharkpeter hat geschrieben:warum
in Gottes Namen soll ich es nicht auch weiterverarbeiten und speichern
können.

Gruß Jens
Weil kein entsprechendes ImagePlugin existiert!. Im
Speicher stehen alle als BMP

Verfasst: 29.04.2007 09:49
von Kaeru Gaman
das widerspricht sich jetzt aber.
wenn im speicher alle als BMP stünden, dann müßte es sich ja auch resizen lassen,
nur speichern als .ico ginge nicht.

Verfasst: 29.04.2007 10:04
von sharkpeter
@ts-soft,

Bingo! Im Speicher stehen alle als *.bmp, und genau darum sage ich ja:
bearbeiten usw. MUSS gehen. Und speichern auch, nur halt nicht als
*.ico, aber das ist ja nicht das Problem. In den unterstützen Formaten
sollte sich das Image jedoch speichern lassen.

@Kearu,

genau das trifft den Kern.

Gruß Jens

Verfasst: 29.04.2007 10:41
von Jilocasin
Es steht aba nicht als BMP direkt im Speicher, sonst würde bei nem ImageGadget keine Transparenz zu sehen sein :wink:

Hab mal was ausprobiert....

Code: Alles auswählen

File.s = OpenFileRequester("Wähl ma'n ICON oda 'n BMP aus", "", "Beides|*.ico;*.bmp", 0)

ImageID = LoadImage(0, File)


If GetObject_(ImageID, SizeOf(BITMAP), @ImageInfo.BITMAP)
  Debug ImageInfo\bmWidth ; Als Beispielwerte ausgeben
  Debug ImageInfo\bmHeight
Else
  Debug "Geht nüt"
EndIf

Verfasst: 29.04.2007 10:50
von Kaeru Gaman
> Es steht aba nicht als BMP direkt im Speicher, sonst würde bei nem ImageGadget keine Transparenz zu sehen sein.
dann muss man eben schreiben, "es steht als Bitmap im Speicher".
auf jeden fall sind es nicht codierte RAW-daten, die im speicher gehalten werden.

btw: auch das format .bmp kann transparenz enthalten.
aber MS hat diese möglichkeit schnell unterbunden, es wäre wohl zu flexibel gewesen,
viele designer hätten mit PAINT arbeiten können und hätten keine zusätzlichen Apps kaufen müssen.


> Hab mal was ausprobiert....
yo und? was machts?

Verfasst: 29.04.2007 10:54
von Jilocasin
Der Soruce zeigt dass Icons und Bitmaps, die beide mit LoadImage() geladen wurden unterschiedlich im Speicher stehen :)