Jump to content
php.lv forumi

Problēmas ar BMP to PNG


Wuu

Recommended Posts

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!

p4h2xb784kmi3k5wytdg.png

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 by Wuu
Link to comment
Share on other sites

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

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 by Wuu
Link to comment
Share on other sites

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

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 by Wuu
Link to comment
Share on other sites

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

×
×
  • Create New...