Wuu Posted December 2, 2008 Report Share Posted December 2, 2008 (edited) Tātad nolasu failu pa 2 byti ,pašā failā slēpjās bildes ,nolasu katru 2 bytu un beigās to konvertējot RGB krāsā sanāk attēls! Tātad savācu pa pixelim! Bet rodas problēma dažām bildēm zūd pikseļi! Itkā failā tie visi attēli ir BMP formātā ,tad varbūt BMP ir vienkārši vairāk krāsu nekā PNG un tie netiek atrasti... Kādi minējumi? Vispār urķēju 95 gada spēles failus :) $im = imagecreate($width, $height); $bg = imageColorAllocate($im, 0, 0, 0); imagecolortransparent($im, $bg); //Te nolasu bytus for($i=0; $i < $height; $i++) { $offset[$i] = convertToInteger(fread($handle, 2)); } $datastart = ftell($handle); $x = 0; $y = 0; //Te jau tiek veidots atēls while ( $y < $height ) { $xoffset = convertToInteger(fread($handle, 2)); $xRun = convertToInteger(fread($handle, 2)); if ( ($xRun + $xOffset) > 2048 ) { break; } else { if ( ( $xRun + $xOffset ) != 0 ) { $x += $xoffset; for($Run = 0; $Run < $xRun; $Run++) { $color[$Run] = convertToInteger(fread($handle, 2)); $r = (($color[$Run] >> 10)*8); $g = ((($color[$Run] >> 5) & 31)*8); $b = (($color[$Run] & 31)*8); if (imagecolorexact($im, $r, $g, $b) == -1) { $col = imagecolorallocate($im, $r, $g, $b); imagesetpixel($im, $x, $y, $col); } else { $found = imagecolorexact($im, $r, $g, $b); imagesetpixel($im, $x, $y, $found); } $x++; } } header ("Content-type: image/png"); imagepng($im); imagedestroy($im); Mēģināju izvadīt BMP formāta bet browseris lamājas ka kļūme atēlā Edited December 2, 2008 by Wuu Link to comment Share on other sites More sharing options...
bubu Posted December 2, 2008 Report Share Posted December 2, 2008 bmp fails nesastāv vien no pikseļiem ar krāsām. Sākumā ir headeris, kuru tev vajag izlaist pirms ģenerēt pikseļus. No headera tu vari izvilkt informāciju par to, kāds ir bildes izmērs, vai cik bitus aizņems katrs pikselis (32, 24, 16, ... ) Palasi šo: http://en.wikipedia.org/wiki/BMP_file_format#BMP_file_header Šis ir otrais topiks, kuram ar php5 fičām nav nekāda sakara (OOP, exceptioni, ..). Izvēlies pareizāku sadaļu. Drīz laikam būs jāpārsauc php5 sadaļa par php6, lai būtu up to date. Un kāpēc tu lasi "pa 2 baiti"? Tev tie visi bmp vienā formātā vai? Un tas, ko tu te uzrakstīji, vairāk izskatās pēc RLE kodēta bmp lasīšanas. Sākumā gan tev dīvains cikls - kur tu $height daudzumā $offset masīvā salasi 2-baitīgus integerus. Kam tas? Vēl arī - tev nebūtu vienkāršāk ar kādu bilžu apstrādes programmu nokonvertēt visus bilžu failus uz png/jpg/whatever kādu citu formātu un tad tos lietot? Link to comment Share on other sites More sharing options...
martins256 Posted December 3, 2008 Report Share Posted December 3, 2008 Sameklē ar google funnkciju imagecreatefrombmp un dzīvo laimīgs. Link to comment Share on other sites More sharing options...
Wuu Posted December 3, 2008 Author Report Share Posted December 3, 2008 Izraku to velnu vienkārši pixelis ir saglabāts 16 bit formātā ,bet php png tak izmanto 32bitus vaina ir konvertējošajā formulā... Es pagaidām pagooglēšu... :) Link to comment Share on other sites More sharing options...
bubu Posted December 3, 2008 Report Share Posted December 3, 2008 Man gan šķiet, ka vaina ir kaut kādā maģiskajā $offset tabulas lasīšanā, kā arī $xOffset un $xRun lasīšanā. 16-bitu pikseļu formātam nekā tāda nav. Link to comment Share on other sites More sharing options...
Wuu Posted December 3, 2008 Author Report Share Posted December 3, 2008 (edited) nē ar pikseļu atainošanu viss ir ok ,jo lielākai daļai zīmējumu (kādi 96%) viss ir ok! http://en.wikipedia.org/wiki/Color_depth 2byti katram bitam pa 8 biti kopā 16 biti tātad katrai krāsai pa 5 biti un 1 liekais ,vai varbūt papildus zaļais tonis :) XRRRRRGGGGGBBBBB Bet php GD2 izmant 24 bitus XRRRRRRRRGGGGGGGGBBBBBBBB Un kā tad lai pareizi pār konvertē ,tas pēc loģikas pat nav iespējams :) Edited December 3, 2008 by Wuu Link to comment Share on other sites More sharing options...
martins256 Posted December 3, 2008 Report Share Posted December 3, 2008 http://paste.php.lv/c732cadce8cff2a30d84ae...f97f22?lang=php izmanto šo te un problēmu nebūs. Link to comment Share on other sites More sharing options...
bubu Posted December 3, 2008 Report Share Posted December 3, 2008 Un kā tad lai pareizi pār konvertē ,tas pēc loģikas pat nav iespējams :) Nu gan pateici.. Lineāri mērogot intervālu [a..b] uz [c..d] nav iespējams? To dara ar viselementārākajām pamatskolas matemātikas zināšanām y = c + (x - a) * (d - c) / (b - a), kur x=vecā vērtība, y=jaunā vērtība. T.i, ja tev ir krāsas vērtība no 0 līdz 100, bet tev vajag dabūt krāsas vērtību no 0 līdz 400, tad y = 0 + (x - 0) * 400 / 100 = x * 4. x = 0, y =0 x = 50 (puse no max), y = 50*4 = 200 (puse no max!) x = 100, y = 100*4 = 400 (max vērtība) Link to comment Share on other sites More sharing options...
Wuu Posted December 3, 2008 Author Report Share Posted December 3, 2008 (edited) nepareizi izteicos ,jo fread lasa bytu... Bet kā nolasīt bitu? Un 2byti konvertēti lasāma veidolā attēlo 5 ciparu skaitli ,kā lai to sadala 3 krāsās? Plus pirmo bitu ,2 bytos vajag ignorēt :) Edited December 3, 2008 by Wuu Link to comment Share on other sites More sharing options...
bubu Posted December 3, 2008 Report Share Posted December 3, 2008 Baits ir mazākā atmiņas vienība, ar ko programma var brīvi manipulēt. Vai tā lasīšana no faila, vai lasīšana no atmiņas. Tev vajag nolasīt veselu baitu un vilkt bitus ārā ar bitwise operatoriem. Un tavs jautājums ir diezgan dīvains - "kā lai sadala". Takš tu to jau savā kodā augstāk dari. $r=...; $g=...; $b=...; Pats savu kodu vairs nesaproti? :) Link to comment Share on other sites More sharing options...
Wuu Posted December 4, 2008 Author Report Share Posted December 4, 2008 Nolēmu likties mierā pārāk daudz laika jāiegulda rezultāts nav tik vērtīgs :D Link to comment Share on other sites More sharing options...
bubu Posted December 4, 2008 Report Share Posted December 4, 2008 Kāds tur laiks jāiegulda? martins256 jau tev #3 postā pateica, kur meklēt gatavu kodu. Link to comment Share on other sites More sharing options...
Recommended Posts