Wuu Posted December 2, 2008 Report 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
bubu Posted December 2, 2008 Report 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?
martins256 Posted December 3, 2008 Report Posted December 3, 2008 Sameklē ar google funnkciju imagecreatefrombmp un dzīvo laimīgs.
Wuu Posted December 3, 2008 Author Report 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... :)
bubu Posted December 3, 2008 Report 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.
Wuu Posted December 3, 2008 Author Report 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
martins256 Posted December 3, 2008 Report Posted December 3, 2008 http://paste.php.lv/c732cadce8cff2a30d84ae...f97f22?lang=php izmanto šo te un problēmu nebūs.
bubu Posted December 3, 2008 Report 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)
Wuu Posted December 3, 2008 Author Report 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
bubu Posted December 3, 2008 Report 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? :)
Wuu Posted December 4, 2008 Author Report Posted December 4, 2008 Nolēmu likties mierā pārāk daudz laika jāiegulda rezultāts nav tik vērtīgs :D
bubu Posted December 4, 2008 Report Posted December 4, 2008 Kāds tur laiks jāiegulda? martins256 jau tev #3 postā pateica, kur meklēt gatavu kodu.
Recommended Posts