Imagecopyresampled は通常通り jpg をサンプリングして圧縮しますが、png はサンプリング後に 0 バイトになり、システムはそれを開くことができません。

WBOY
リリース: 2016-06-20 12:36:27
オリジナル
1558 人が閲覧しました

imagecopyresampled は画像のサンプリングと jpg の圧縮には正常ですが、サンプリング後に png は 0 バイトになり、システムはそれを開くことができません。コードは次のとおりです。

 $width = 200;$height = 200;header("Content-Type: {$data['file_type']}");           /// [file_type] => image/pnglist($width_orig, $height_orig) = getimagesize(".{$data['full_file_path']}");   //图片路径$ratio_orig = $width_orig/$height_orig;if ($width/$height > $ratio_orig) {	 $width = $height*$ratio_orig;	} else {  $height = $width/$ratio_orig;	}				// 重新取样$image_p = imagecreatetruecolor($width, $height);$image = imagecreatefromjpeg(".{$data['full_file_path']}");$push = "image".$data['image_type'];imagecopyresampled($image_p, $image, 0, 0, 0, 0, $width, $height, $width_orig, $height_orig);$push($image_p, $data['min_im'], 100);imagedestroy($image_p); imagedestroy($image);
ログイン後にコピー

jpg 形式のグラフィックス。サンプリング後は正常です。png のみです。 サンプリング圧縮は次のようになります。


ディスカッションへの返信 (解決済みの解決策)

完全なコードを投稿してください

png をフォーマットするときは、14 行目で imagecreatefrompng() を使用する必要があります
プログラムは判断しませんでしたか?

png をフォーマットするとき、14 行目は imagecreatefrompng() を使用する必要があります。
あなたのプログラムは判断を下しませんでしたか?


ログイン後にコピー

申し訳ありませんが、コードは次の条件に達していません。日付:
	//重新对图片采样,平滑插入像素值  	function upload_headimg($file='file') {				$path = getpath();		if(empty($path)){			return '';		}		$config['upload_path'] = $path;		$config['allowed_types'] = 'jpg|jpeg|gif|png';		$config['max_size'] = '10240';		$config['file_name'] = 'wj_'.time().mt_rand(1000, 9999);		$config['file_ext_tolower'] = TRUE;		$CI = &get_instance();		$CI->load->library('upload', $config);				$res =  $CI->upload->do_upload($file);		if($res){			$data = $CI->upload->data();			$path = ltrim($path,'.');			$data['full_file_path'] = $path.'/'.$data['file_name'];			$data['min_im'] = '.'.$path.'/min'.$data['file_name'];			$width = 200;			$height = 200;			header("Content-Type: {$data['file_type']}");			list($width_orig, $height_orig) = getimagesize(".{$data['full_file_path']}");			$ratio_orig = $width_orig/$height_orig;						if ($width/$height > $ratio_orig) {			   $width = $height*$ratio_orig;			} else {			   $height = $width/$ratio_orig;			}						// 重新取样			$image_p = imagecreatetruecolor($width, $height);			$create_im ="imagecreatefrom".$data['image_type'];			$image = $create_im(".{$data['full_file_path']}");			$push = "image".$data['image_type'];			imagecopyresampled($image_p, $image, 0, 0, 0, 0, $width, $height, $width_orig, $height_orig);			$push($image_p, $data['min_im'], 100);			imagedestroy($image_p);        	imagedestroy($image);			//exit;			return $data;											}else{			return $CI->upload->display_errors();		}		}
ログイン後にコピー
ログイン後にコピー

完全なコードを投稿してください


	//重新对图片采样,平滑插入像素值  	function upload_headimg($file='file') {				$path = getpath();		if(empty($path)){			return '';		}		$config['upload_path'] = $path;		$config['allowed_types'] = 'jpg|jpeg|gif|png';		$config['max_size'] = '10240';		$config['file_name'] = 'wj_'.time().mt_rand(1000, 9999);		$config['file_ext_tolower'] = TRUE;		$CI = &get_instance();		$CI->load->library('upload', $config);				$res =  $CI->upload->do_upload($file);		if($res){			$data = $CI->upload->data();			$path = ltrim($path,'.');			$data['full_file_path'] = $path.'/'.$data['file_name'];			$data['min_im'] = '.'.$path.'/min'.$data['file_name'];			$width = 200;			$height = 200;			header("Content-Type: {$data['file_type']}");			list($width_orig, $height_orig) = getimagesize(".{$data['full_file_path']}");			$ratio_orig = $width_orig/$height_orig;						if ($width/$height > $ratio_orig) {			   $width = $height*$ratio_orig;			} else {			   $height = $width/$ratio_orig;			}						// 重新取样			$image_p = imagecreatetruecolor($width, $height);			$create_im ="imagecreatefrom".$data['image_type'];			$image = $create_im(".{$data['full_file_path']}");			$push = "image".$data['image_type'];			imagecopyresampled($image_p, $image, 0, 0, 0, 0, $width, $height, $width_orig, $height_orig);			$push($image_p, $data['min_im'], 100);			imagedestroy($image_p);        	imagedestroy($image);			//exit;			return $data;											}else{			return $CI->upload->display_errors();		}		}
ログイン後にコピー
ログイン後にコピー

40 行目で理由が見つかりました
$push($ image_p, $data['min_im'] , 100);
関数が imagepng の場合、3 番目のパラメーターの範囲は 0 ~ 9 です。
imagejpeg の場合、範囲は 0 ~ 100 です。

リスケールの提案についてjpeg の 0 ~ 99 の品質範囲を png の 0 ~ 9 の範囲に変換します。jpeg の場合は 99 が最小圧縮 (最大の品質)、png の場合は 9 が最大の圧縮 (品質は変わりません) であることに注意してください。

が見つかりました 理由は行 40 です

$push($image_p, $data['min_im'], 100);

関数が次の場合、3 番目のパラメーターの範囲は 0 ~ 9 です。 imagepng
imagejpeg 100 の場合、範囲は 0 ~

ありがとうございます。圧縮された画像をブラウザに出力せずに保存することはできますか?配列を直接返したいだけですが、ブラウザでは常に 20X20 のグラフィックが生成され、実行が停止します


ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート
私たちについて 免責事項 Sitemap
PHP中国語ウェブサイト:福祉オンライン PHP トレーニング,PHP 学習者の迅速な成長を支援します!