Schon seit etwas längeren habe ich ein Problem, dass sich einfach nicht lösen lassen will.
Ich versuche ganz ohne Erweiterungen oder externen Programmen wie Imagic ein Raw bild zu convertieren.
Mir ist natürlich klar, dass meine methode relativ langsam und alles andere als performant ist. Unversucht wollte ich es dennoch nicht lassen.
Also: die zu konvertieren raw bilder haben alle samt 4 kanäle (B G R A) sind 8bit und interleaved. Sollte nicht so schwer sein, dachte ich mir, und habe es folgender maßen angegriffen:
Spoiler anzeigen
Alles anzeigen
Und hiermit ordentlicher formatierung
Dabei wurde dieses 16x16 px bild
zu diesem hier
Vllt sieht man es hier besser:
wurde zu
Ich habe nach längerem googlen etwas in Java gefunden. Und lustiger weise wars IsmAvatar (dem macher von LGM) der dieses Problem hatte. Ich habe die source von LGM durchstöbert, und dann dies gefunden: pastie.org/883077 (java halt)
Bei ihm funktioniert es. Leider ist mir die java syntax überhaubt nicht vertraut, kann also kaum herrauslesen was er macht und was ich nicht mache.
Ich habe ne vermutung, dass es was damit zu tun hat, dass das Raw bild Interleavedist. Und wenn ja, um welchen faktor wurde Interleaved. Und wie mache ich das dann?
Nachdem ich schon die letzten wochen den Chat mit meinem Problem genervt habe, dort allerdings keiner ne antwort auf die einfachsten Fragen hatte, hoffe ich, dass sich hier jemand findet, der meinen Fehler aufdecken kann.
MfG SDX
Ich versuche ganz ohne Erweiterungen oder externen Programmen wie Imagic ein Raw bild zu convertieren.
Mir ist natürlich klar, dass meine methode relativ langsam und alles andere als performant ist. Unversucht wollte ich es dennoch nicht lassen.
Also: die zu konvertieren raw bilder haben alle samt 4 kanäle (B G R A) sind 8bit und interleaved. Sollte nicht so schwer sein, dachte ich mir, und habe es folgender maßen angegriffen:
PHP-Quellcode
- <?php
- error_reporting(E_ALL | E_STRICT);
- class raw {
- public $fortsrt=0;
- private $raw_data;
- public function __construct($data) {
- $this->raw_data=$data;
- }
- private function read_byte() {
- $ret=ord(substr($this->raw_data,$this->fortsrt,1));
- $this->fortsrt++;
- if (isset($ret)) {
- return $ret;
- } else {
- return 0;
- }
- }
- private function get_size() {
- return strlen($this->raw_data);
- }
- public function read() {
- $size=$this->get_size();
- $pos=0;
- for($a=0;$a<=$size;$a++){
- switch ($a%4) {
- case (0) : $return['b'][$pos]=$this->read_byte(); break;
- case (1) : $return['g'][$pos]=$this->read_byte(); break;
- case (2) : $return['r'][$pos]=$this->read_byte(); break;
- case (3) : $return['a'][$pos]=$this->read_byte(); $pos++; break;
- }
- }
- return $return;
- }
- public function write_png($input, $width, $height) {
- if ($width*$height*4 != $this->get_size()) {return -1; }
- $im = imagecreatetruecolor($width, $height);
- for ($x=0;$x<$width;$x++) {
- for ($y=0;$y<$height;$y++) {
- $pos=$x*$y;
- $color = imagecolorallocate($im,
- $input['r'][$pos],
- $input['g'][$pos],
- $input['b'][$pos]);
- imagefilledrectangle($im,$x,$y,$x+1,$y+1,$color);
- }
- }
- return $im;
- }
- }
- $file=fopen("output/img/sprite_sprite0/sub.0.raw","r");
- $str=fread($file,filesize("output/img/sprite_sprite0/sub.0.raw"));
- fclose($file);
- $raw = new raw($str);
- $data = $raw->read();
- $image = $raw -> write_png($data,16,16);
- header ('Content-type: image/png');
- imagepng($image);
- imagedestroy($image);
- //print_r($data);
- ?>
Dabei wurde dieses 16x16 px bild


Vllt sieht man es hier besser:


Ich habe nach längerem googlen etwas in Java gefunden. Und lustiger weise wars IsmAvatar (dem macher von LGM) der dieses Problem hatte. Ich habe die source von LGM durchstöbert, und dann dies gefunden: pastie.org/883077 (java halt)
Bei ihm funktioniert es. Leider ist mir die java syntax überhaubt nicht vertraut, kann also kaum herrauslesen was er macht und was ich nicht mache.
Ich habe ne vermutung, dass es was damit zu tun hat, dass das Raw bild Interleavedist. Und wenn ja, um welchen faktor wurde Interleaved. Und wie mache ich das dann?
Nachdem ich schon die letzten wochen den Chat mit meinem Problem genervt habe, dort allerdings keiner ne antwort auf die einfachsten Fragen hatte, hoffe ich, dass sich hier jemand findet, der meinen Fehler aufdecken kann.
MfG SDX