проблема с созданием png

Devona

Новичок
проблема с созданием png

условия:
флеш передаёт массив с данными об изображении. данные - цвет попиксельно. задача сгенерить из этого png файл
код такой
PHP:
$data = explode(",", $_POST['msk']);
	    	
			$width = 365;
			$height = 481;

			$image	     = imagecreatetruecolor($width, $height);
			$background = imagecolorallocate($image, 0, 0, 0);

			$i = 0;
			for($x = 1; $x <= $height; $x++){
				for($y = 1; $y <= $width; $y++){
					$int 	= hexdec($data[$i++]);
					$color 	= ImageColorAllocate ($image, 0xFF & ($int >> 0x10), 0xFF & ($int >> 0x8), 0xFF & $int);
					imagesetpixel ($image, $y, $x, $color);
				}
			}

			imagepng($image, "picture.png");
			
			imagedestroy( $image );
используя например imagejpeg сохранение картинки проходит успешно. естественно без прозрачности.
но. при выполнении скрипта выше происходит слелующее: файл picture.png создаётся но с нулевой длиной. при попытке просмотреть его стандартным виндовым просмотрщиком картинок - пишет что файл используется другой программой. удалить его тоже нельзя.
вопрос - в чём проблема?
гуглил. все найденные примеры с простым созданием png файлов работают на ура. но этот скрипт не хочет.
 

The employer

Новичок
Все нормально с приведенным скриптом. Если не работает - проблема наверняка за пределами показанного кода. Например, файл с именем "picture.png" действительно кем-то занят, и стоит сохранить файл под другим именем и все пройдет нормально.

Да, и еще. Вызов ImageColorAllocate можно исключить - для truecolor-изображений он делает ни что иное как обратное восстановление значения $int, столь заботливо разобранного сдвигами на кусочки :)

Можно вызывать imagesetpixel прямо с $int вместо $color.
 

Devona

Новичок
касательно файла - до выполнения скрипты такого файла нет. он создаётся в результате работы скрипта. а дальше его удалить получается только рестартанув апач
про imagesetpixel сенкс. заработался :)
 

The employer

Новичок
А, еще координаты для imagesetpixel указываются с нуля а не с единицы, исправь циклы.
 

Devona

Новичок
The employer
вот я тоже думал что с нуля. как показала практика, если указать координаты с нуля - итоговую картинку разворачивает.
 

The employer

Новичок
Автор оригинала: Devona
The employer
вот я тоже думал что с нуля. как показала практика, если указать координаты с нуля - итоговую картинку разворачивает.
А ты просто проверь:

PHP:
$img = imagecreatetruecolor( 100, 100 );

for( $i = 0; $i < 100; $i++ ) {
    imagesetpixel( $img,  $i,  0, 0xff0000 );
    imagesetpixel( $img,  $i, 99, 0xff0000 );
    imagesetpixel( $img,   0,  $i, 0xff0000 );
    imagesetpixel( $img, 99,  $i, 0xff0000 );
}

imagepng( $img, "picture.png", 0 );
Получилась красная рамка? ;)
 

Devona

Новичок
получилась конечно.
я всего лишь сказал, что в моём конкретном примере, при передаче координат с нуля - картинка поворачивалась под углом. возможно имеет место быть специфика передачи битмап данных из флеша.

з.ы. вариант file_put_contents с битмап данными - даёт такой же результат.
 

The employer

Новичок
Странные дела. Если под поворотом имется в виду "ступенька" в один пиксел на каждой следующей строке - так это обычно бывает если ошибся с определением ширины или высоты изображения (смотря что сканируешь первым). Тогда при считывании вложенными циклами как раз получается - только не поворот а наклон (skew).

Проверь еще раз свои данные.
 

Devona

Новичок
The employer
возможно ошибка в этом. но основную проблему она не решает. увы.

-~{}~ 17.07.09 16:56:

вопрос снят. проблема была в координатах.
The employerспасибо за наводку. именно это и было корнем проблемы. сбило с толку то, что jpg картинка создавалась без проблем
 
Сверху