Autor |
Beitrag |
Insignificant
      
Beiträge: 81
|
Verfasst: Mo 03.04.06 17:53
Hallo....ich versuche verzweifelt das User-Bild von dem Windows-Account richtig anzeigen zu lassen, was mir jedoch leider nicht gelingt.
Delphi-Quelltext 1: 2:
| Image1.Picture.Bitmap.LoadFromFile'C:\Dokumente und Einstellungen' + '\All Users\Anwendungsdaten\Microsoft\User Account Pictures\' + GetUser + '.bmp'); } |
Aus irgendeinem Grund werden die Bilder vom User anstatt in den originalfarben, anders dargestellt. (Siehe Anhang) hat jemand eine Idee?
PS.: Wenn komischerweise die original bilder (nicht die User bilder) verwendet, funktioniert es einwandfrei!
Einloggen, um Attachments anzusehen!
|
|
nullplan001
      
Beiträge: 212
Win 2000 Professional, Debian Linux 4.0 (Etch,Stable)
Pascal (FreePascal 2.0.2, TurboPascal 7.0), C(++) (G++/GCC 3.4.2 + MinGW), Java (JDK 1.5.0_07), PHP (PHP 5.1.4)
|
Verfasst: Mo 03.04.06 18:17
Hi all,
spontan fällt mir dazu jetzt nur ein, dass Delphi möglicherweise über eine falsche Palette verfügt. Hat den Nachteil: Wie korrigiere ich das jetzt? Die Standard-Tabelle kann ich dir ohne weiteres geben. Zumindest für 256-Farben-Bitmaps. Weiter geht mein Programm nicht. (Bei dir sind es wahrscheinlich 24-Bit-Bitmaps. Das könnte ein wenig in den Webspace gehen, wenn ich so was posten würde. Sind immerhin 2^24 Farben.)
Cya,
nullplan
|
|
Insignificant 
      
Beiträge: 81
|
Verfasst: Do 06.04.06 13:09
Hmmm....bist du sicher das es daran liegt? Weil komischerweise wird das original Bild davon ja auch in den richtigen Farben dargestellt. Das ist ja das *verwunderliche* an der Sache.
|
|
Lossy eX
      
Beiträge: 1048
Erhaltene Danke: 4
|
Verfasst: Do 06.04.06 13:52
Nullplan. Du willst nicht allen erstes für RGB eine Farbtabelle anlegen, oder? Und wenn ja nach welchen Kriterien willst du da gehen? Willst du dir jede Farbe schnappen und dir dazu das passende Gegenstück raus suchen?
Also wenn ich das auf den kleinen Bildern richtig sehen kann, dann würde ich spontan behaupten, dass Blau zu Grün geworden ist. Grün zu Rot. Und Rot müsste dann eigentlich Blau sein. Ich würde einfach mal das Bild nach dem Laden Pixel für Pixel durchgehen (mittels Scanlines) und dann die Kanäle tauschen.
PS: Zeigt denn ein Windowsbetrachter die Bilder richtig an. Also so etwas wie IrfanView?
_________________ Nur die Menschheit ist arrogant genug, um zu glauben sie sei die einzige intelligente Lebensform im All. Wo nicht mal das nachhaltig bewiesen wurde.
|
|
F34r0fTh3D4rk
      
Beiträge: 5284
Erhaltene Danke: 27
Win Vista (32), Win 7 (64)
Eclipse, SciTE, Lazarus
|
Verfasst: Do 06.04.06 15:15
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16:
| procedure TForm1.Button1Click(Sender: TObject); var x, y: integer; myrgb, r, g, b: integer; begin image1.Picture.LoadFromFile('C:\Dokumente und Einstellungen\All Users\Anwendungsdaten\Microsoft\User Account Pictures\' + getuser + '.bmp'); for x := 0 to image1.Width do for y := 0 to image1.Height do begin myrgb := colortorgb(image1.canvas.pixels[x, y]); r := GetBValue(myrgb); g := GetRValue(myrgb); b := GetGValue(myrgb); image1.canvas.pixels[x, y] := rgb(r, g, b); end; end; |
mit scanlines gehts natürlich schneller
falls du das für jeden user machen willst, solltest du den pfad dynamisch laden, kann ja sein, dass jemand kein deutsches win hat, bzw windows auf I:\ so wie ich 
|
|
Insignificant 
      
Beiträge: 81
|
Verfasst: Do 06.04.06 15:40
Ja, mein Bildbetrachter zeigt die Bilder richtig an.
Ich habs nun nach deinem Beispiel gemacht F34r0fTh3D4rk und ich muss sagen es sieht schon wesentlich besser aus.
Aber naja *perfekt* isses noch immer nicht...
PS.: In meiner Anwendung ist der Pfad schon dynamisch, ich dachte mir aber es sei sinnvoller fürs Forum den pfad so auszulesen damit auch jeder weiss wo was ist und so ^^
Einloggen, um Attachments anzusehen!
|
|
nullplan001
      
Beiträge: 212
Win 2000 Professional, Debian Linux 4.0 (Etch,Stable)
Pascal (FreePascal 2.0.2, TurboPascal 7.0), C(++) (G++/GCC 3.4.2 + MinGW), Java (JDK 1.5.0_07), PHP (PHP 5.1.4)
|
Verfasst: Do 06.04.06 17:03
Hmmm... sieht so aus, als würde er die Farben zu grell kriegen. Lade mal die Grafiken in Paint und vergrößere beide sehr stark. Delphi macht den Stängel rosa und blau, anstatt grau und weiß. Falsche Sättigung und Helligkeit? Och nö... Wie du das verbessern kannst, weis ich leider nicht (siehe Rand: Ich hab kein Delphi, daraus folgt: keine Delphi-Hilfe, keine Beschreibung von TImage1). Aber könnte sein, oder?
Tschö,
nullplan
_________________ Ich fahr' nicht selber, weil ich festgestellt habe: ich fahre zu emotional. Bin 180 gefahren wo 30 erlaubt war... -- Jürgen von der Lippe
|
|
Lossy eX
      
Beiträge: 1048
Erhaltene Danke: 4
|
Verfasst: Fr 07.04.06 09:40
Zu Not poste mal das BMP was du versucht darzustellen. Dann können wir uns das mal anschauen. Das dürfte wohl mehr bringen als hier jetzt so rumzuraten.
_________________ Nur die Menschheit ist arrogant genug, um zu glauben sie sei die einzige intelligente Lebensform im All. Wo nicht mal das nachhaltig bewiesen wurde.
|
|
Insignificant 
      
Beiträge: 81
|
Verfasst: Fr 07.04.06 15:54
Das Bild kann man > hier< finden.
|
|
Lossy eX
      
Beiträge: 1048
Erhaltene Danke: 4
|
Verfasst: Mo 10.04.06 09:25
Sorry, dass es ein bisschen länger gedauert hat.
Okay. Ich habe eine Gute und eine schlechte Nachricht. Die Gute. Das Bitmap scheint augenscheinlich in Ordnung zu sein und ich weiß warum es Delphi da aushebt. Die Schlechte ist allerdings die, dass ich nicht genau weiß wie man es umgehen soll.
Also einmal mit IrfanView abgeseichert und dann mit einem Hexeditor die beiden Dateien vergleichen lassen. Und siehe da. Anscheinend ist in den Originalbildern ein Flag anders gesetzt. Dieses ist eine Größenangabe für den Bitmapheader und das ist anders als es eigentlich üblich wäre. So wie es scheint interpretiert Delphi diese Infos nicht so ganz richtig. Er beginnt nämlich 10 Bytes früher mit dem Lesen als die Daten beginnen.
Das TBitmap ist aber leider nicht so berauschend was das einlesen der Bilder angeht. Der kommt unter anderem auch nicht mit größeren Größenangaben klar, falls diese angeben, dass am Ende der Datei zwei nullzeichen vorhanden sind. Hatte ich auch schon. Leider gibt es nicht wirklich viele Alternative.
Wie auch immer. Denke mal zu Darstellen dieser Bilder musst du die Dateien per Hand laden. Du kannst die Daten ja auch in einem TBitmap ablegen. Darfst sie aber nicht damit laden. Musste mal im Forum schauen. Da gibt es schon den ein oder anderen Code dazu.
_________________ Nur die Menschheit ist arrogant genug, um zu glauben sie sei die einzige intelligente Lebensform im All. Wo nicht mal das nachhaltig bewiesen wurde.
|
|
F34r0fTh3D4rk
      
Beiträge: 5284
Erhaltene Danke: 27
Win Vista (32), Win 7 (64)
Eclipse, SciTE, Lazarus
|
Verfasst: Mo 10.04.06 10:08
liegt der flag immer beim gleichen offset ?
wenn die position statisch ist, kann man da programmintern vielleicht ein wenig was drehen
|
|
Lossy eX
      
Beiträge: 1048
Erhaltene Danke: 4
|
Verfasst: Mo 10.04.06 10:37
Eigentlich schon. Aber daraus resultierend musst du die Größe auch entsprechend ändern und die kompletten Daten verschieben. Ich denke mal es wäre wesentlich einfacher, wenn man den Header einliest und dann entsprechend auf das Offset reagiert und es überspringt. Und dann die Daten ganz normal in Scanlines einliest.
_________________ Nur die Menschheit ist arrogant genug, um zu glauben sie sei die einzige intelligente Lebensform im All. Wo nicht mal das nachhaltig bewiesen wurde.
|
|
Insignificant 
      
Beiträge: 81
|
Verfasst: Mo 10.04.06 12:55
Und wie genau macht man sowas? Verstanden so in etwa was Sache ist und wie man das dann evt. umgehen kann habe ich schon. Nur keine Ahnung wie man sowas in irgendeiner Art und Weise in die Praxis umsetzt.
|
|
Darth Sitthiander
      
Beiträge: 95
|
Verfasst: Sa 15.04.06 13:39
Ich glaube man muss nur den pfad direkt eingeben, dann gehts bei mir. Jetzt hab ich da ein problem. Wie kann ich herausfinden wo der user diese bilder gespeichert hat? Muss ich das per registry machen oder gibt es da eine function für? Danke im Vorraus.
|
|
nullplan001
      
Beiträge: 212
Win 2000 Professional, Debian Linux 4.0 (Etch,Stable)
Pascal (FreePascal 2.0.2, TurboPascal 7.0), C(++) (G++/GCC 3.4.2 + MinGW), Java (JDK 1.5.0_07), PHP (PHP 5.1.4)
|
Verfasst: So 16.04.06 10:38
Hi all,
hab ich dich richtig verstanden, die Bilder liegen in %systemdrive%\Dokumente und Einstellungen\%username%\Anwendungsdaten\blabla ? Das kann man rauskriegen. Kurz geschrieben heist der Pfad nämlich eingentlich %userprofile%\Anwendungsdaten\blabla. %userprofile% kriegst du mit getenv raus (Wer die Variable verändert, ist selbst schuld, Windows stützt sich nämlich beim Laden des Profils auf diese Variable -> Veränderung = Tod von Windows.) Wenn du bei getenv nur einen leeren String rauskriegst, ist die Variable nicht gesetzt, oder enthält einen leeren String. In dem Fall ist Windows ziemlich schlecht dran. Aber hier die Funktion:
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17:
| function getPictureDir:string; var isNT : boolean; tmp : string; begin isNT := (getenv('OS') <> ''); if isNT then begin tmp := getenv('userprofile'); if tmp = '' then tmp := 'C:\Dokumente und Einstellungen\All Users\Anwendungsdaten\blabla' else tmp := tmp + '\Anwendungsdaten\blabla'; end else Result := tmp; end; |
HTH und tschö,
nullplan
_________________ Ich fahr' nicht selber, weil ich festgestellt habe: ich fahre zu emotional. Bin 180 gefahren wo 30 erlaubt war... -- Jürgen von der Lippe
|
|
Darth Sitthiander
      
Beiträge: 95
|
Verfasst: Mo 17.04.06 01:33
Das erscheint mir schon logisch, aber ich hätte es gern 100%tig richtig. Bei mir heisst der ordner nämlich seit derwindowsinstallation all users.windows. Hoffentlich gibt es da eine lösung. Danke.
|
|
nullplan001
      
Beiträge: 212
Win 2000 Professional, Debian Linux 4.0 (Etch,Stable)
Pascal (FreePascal 2.0.2, TurboPascal 7.0), C(++) (G++/GCC 3.4.2 + MinGW), Java (JDK 1.5.0_07), PHP (PHP 5.1.4)
|
Verfasst: Mo 17.04.06 17:42
Naja, das ist ja auch nur eine Notlösung. Hmm... für All Users heist die Umgebungsvariable %alluserprofile%. Aber auch die kann ungesetzt oder undefiniert sein. Kannst ja noch etwas in der Richtung einbauen. Sieht dann so aus:
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20:
| function getPictureDir:string; var isNT : boolean; tmp : string;
begin isNT := (getenv('OS') <> ''); if isNT then begin tmp := getenv('userprofile'); if tmp = '' then if getenv('alluserprofile') = '' then tmp := 'C:\Dokumente und Einstellungen\All Users\Anwendungsdaten\blabla' else tmp := getenv('alluserprofile') + '\Anwendungsdaten\blabla' else tmp := tmp + '\Anwendungsdaten\blabla'; end else Result := tmp; end; |
Oh, verschachtelte if's. Kann sein, dass da eine LostSemicolonException auftritt. Ach, war ja jetzt gar nicht Java  Naja, ich denke, dass das deine bedenken beheben sollte: Wenn es keine %userprofile% gibt, nimm %alluserprofile%, wenns das nicht gibt, nimm Standardpfad. Should be it.
HTH und Tschö,
nullplan
_________________ Ich fahr' nicht selber, weil ich festgestellt habe: ich fahre zu emotional. Bin 180 gefahren wo 30 erlaubt war... -- Jürgen von der Lippe
|
|
Darth Sitthiander
      
Beiträge: 95
|
Verfasst: Di 18.04.06 00:41
Ich hanbs jetzt mal mit nem label getestet, und bei mir steht der nach knopfdruck leer. code und so hab ich drin^^. Stimmt diese Funktion?
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8:
| function GetEnv(Variable:string):string; var buffer:array[1..1024] of char; begin if GetEnvironmentVariable( pChar(variable) , @Buffer, Sizeof(buffer) )=0 then result:='' else result:=buffer; end; |
|
|
nullplan001
      
Beiträge: 212
Win 2000 Professional, Debian Linux 4.0 (Etch,Stable)
Pascal (FreePascal 2.0.2, TurboPascal 7.0), C(++) (G++/GCC 3.4.2 + MinGW), Java (JDK 1.5.0_07), PHP (PHP 5.1.4)
|
Verfasst: Di 18.04.06 17:08
Hi all,
Delphi kennt kein getenv()? Schwach, wie ich finde, aber ... solange sich dein Code kompilieren lässt, und du ihn an prominenten Beispielen wie PATH getestet hast, sollte nichts schief gehen (Unter TP und FP gibt es eine Funktion namens getenv, die einem alle Arbeit in die Richtung abnimmt: Wenns sie nicht gibt, gibts nen leeren String, sonst den Inhalt der Variablen)
Tschö,
nullplan
P.S.: solltest du je für ein UNIX-basiertes Betriebssystem schreiben: Dort sind die Umgebungsvariablen Case-Sensitiv. Aber Windows ist da zum Glück nicht so.
_________________ Ich fahr' nicht selber, weil ich festgestellt habe: ich fahre zu emotional. Bin 180 gefahren wo 30 erlaubt war... -- Jürgen von der Lippe
|
|
Darth Sitthiander
      
Beiträge: 95
|
Verfasst: Di 18.04.06 17:23
|
|