ホームページ  >  記事  >  バックエンド開発  >  Imagecopyresampled は通常通り jpg をサンプリングして圧縮しますが、png はサンプリング後に 0 バイトになり、システムはそれを開くことができません。

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

WBOY
WBOYオリジナル
2016-06-20 12:36:271545ブラウズ

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 のグラフィックが生成され、実行が停止します


声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。