[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Принцип сжатия изображения png
Helram
Привет, подскажите как работают программы по сжиманию фото png? написал скрипт который делает точную копию изображения.
Берет изображение - проверяем цвет в каждом пикселе + прозрачность и добавляем в многомерный массив цветов { key[цвет][] value=array(пиксель по горизонтали, пиксель по вертикали) } .
Далее пробегаемся по массиву, рисуем новое изображения и в дальнейшем сохраняем его.
Логика проста (мы сделали точную копию) изображения - если подумать изображение чистое в нем всякой ненужной информации (то есть как например paint.net - после сохранения в сам файл прописывает что он был создан через программы paint.net), вообще скрипт такие картинки созданные через paint и подобные программы делаем меньше в весе, но вот вопрос - как создана эта картинка? user posted image
Масштабы её большие, а весит всего 89 206 байт, а мой скрипт создает изображение в 264 766 байт - хотя в точности перерисовывает её...

Вот сам скрипт:

$path='/images/kubik.png';//Изображение

$path2='/images/kubik2.png';//Новое изображение

$image=imagecreatefrompng($_SERVER['DOCUMENT_ROOT'].$path);
$width=imagesx($image);
$height=imagesy($image);

$png=imagecreatetruecolor($width, $height);
imagealphablending($png, false);
imagesavealpha($png, true);

$arr=array();
$arr_palitra=array('255|255|255|127'=>array());
for($h=0; $h<$height; $h++){
for($w=0; $w<$width; $w++){
$rgba=imagecolorat($image, $w, $h);
$arr_rgba=imagecolorsforindex($image, $rgba);
if($arr_rgba['alpha']<127){
$rgba=$arr_rgba['red'].'|'.$arr_rgba['green'].'|'.$arr_rgba['blue'].'|'.$arr_rgba['alpha'];
if(!isset($arr_palitra[$rgba])){
$arr_palitra[$rgba]=1;
}
$arr[$rgba][]=array($w,$h);
}else{
$arr['255|255|255|127'][]=array($w,$h);
}
}
}


foreach($arr_palitra as $key_color => $color){
$explode=explode('|', $key_color);
$color=imagecolorallocatealpha($png,$explode[0],$explode[1],$explode[2],$explode[3]);
foreach($arr[$key_color] as $where){
imagesetpixel($png, $where[0], $where[1], $color);
}
}


imagepng($png,$_SERVER['DOCUMENT_ROOT'].$path2);
imagedestroy($image);
imagedestroy($png);
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2024 Invision Power Services, Inc.