1. このことから、imagecreatetruecolor 関数の機能は明らかに黒い背景画像を作成することであることがわかります。その最初のパラメーターは作成された画像の幅であり、2 番目のパラメーターは作成された画像の高さです。この関数の戻り値(画像識別子)は変数に格納されます。
2. imagecreatefromjpeg の機能は、メモリに分割する画像を読み取ることです (ここで疑問が生じるかもしれません。ハードディスクから直接読み取ることはできません。なぜ最初にメモリに読み取る必要があるのでしょうか?不適切なたとえを使用すると、あなたは普段お金を使うときはあまりお金を入れないと思いますが、お金を使わないときも同様です。この写真では、この写真を分割したり、他の操作を実行したりするときに、それをメモリに読み込んでいます)
3. imagecopyresampled 関数を見てみましょう。その機能は、元の画像をセグメント化し、それとサンプル (投影と理解しています) を imagecreatefromjpeg で作成された背景画像にコピーすることです。
上記の例は、$image画像を座標(100,100)から分割し、分割後の幅は400、高さは300です。そして、画像は座標(0,0)から画像$image_pに投影されます。投影のサイズは $new_width、高さは $new_height です。// ファイル
$filename = 'temp/Sunset.jpg';
$パーセント = 0.5;
// コンテンツタイプ
header('Content-type: image/jpeg');
// 新しい次元を取得します
list($width, $height) = getimagesize($filename);
$new_width = $width * $percent;
$new_height = $height * $percent;//元の画像の長さと幅の 0.5 を新しい長さと幅として使用して、新しい画像を作成します。この画像のシンボルは $image_p です
//出力
。 $image_p = imagecreatetruecolor($new_width, $new_height);
// JPEG ファイルまたは URL から新しい画像を作成します
$image = imagecreatefromjpeg($filename);
// 元の画像を座標(100, 100)から分割します。分割した長さは元の画像の半分(400)、高さは(300)になります。分割した画像を、座標 ( 0, 0) のエリアにあります。 imagecopyresampled($image_p, $image, 0, 0, 100, 100, $new_width, $new_height, 400, 300);
imagejpeg($image_p, null, 100); //品質は、0 (最低品質、小さいファイル) から 100 (最高品質、最大ファイル) の範囲の画像出力の品質です。
?>
//ファイルとズームのサイズ
//$imgfile = 'smp.jpg'; //$パーセント = 0.2; header('コンテンツタイプ: 画像/jpeg'); list($width, $height) = getimagesize($imgfile); $newwidth = $width * $パーセント
; $newheight = $height * $パーセント
; $thumb = ImageCreateTrueColor($newwidth,$newheight); $source = imagecreatefromjpeg($imgfile); imagecopyresize($thumb, $source, 0, 0, 0, 0, $newwidth, $newheight, $width, $height
); 画像jpeg($thumb)
?>
さらに詳しいチュートリアル/*コンストラクター - サムネイルとウォーターマークを生成、パラメーターの説明:
var $dstimg;
$srcFile-画像ファイル名,
$dstFile-保存ファイル名,
$markwords-透かしテキスト,
$markimage-ウォーターマーク画像,
$dstW-画像保存幅,
$dstH-画像保存高さ、
$rate-画像保存品質*/
makethumb("a.jpg","b.jpg","50","50");
関数 makethumb($srcFile,$dstFile,$dstW,$dstH,$rate=100,$markwords=null,$markimage=null)
{
$data = GetImageSize($srcFile); スイッチ($data[2])
{
ケース 1:
$im=@ImageCreateFromGIF($srcFile); 休憩
ケース 2:
$im=@ImageCreateFromJPEG($srcFile); 休憩
ケース 3:
$im=@ImageCreateFromPNG($srcFile); 休憩
}
if(!$im) は False を返します。 $srcW=イメージSX($im); $srcH=画像SY($im); $dstX=0; $dstY=0; if ($srcW*$dstH>$srcH*$dstW)
{
$fdstH = ラウンド($srcH*$dstW/$srcW); $dstY = フロア(($dstH-$fdstH)/2); $fdstW = $dstW; }
それ以外は
{
$fdstW = ラウンド($srcW*$dstH/$srcH); $dstX = フロア(($dstW-$fdstW)/2); $fdstH = $dstH; }
$ni=ImageCreateTrueColor($dstW,$dstH); $dstX=($dstX<0)?0:$dstX; $dstY=($dstX<0)?0:$dstY; $dstX=($dstX>($dstW/2))?フロア($dstW/2):$dstX; $dstY=($dstY>($dstH/2))?フロア($dstH/s):$dstY; $white = ImageColorAllocate($ni,255,255,255); $black = ImageColorAllocate($ni,0,0,0); imagefilledrectangle($ni,0,0,$dstW,$dstH,$white);//背景色を塗りつぶす
ImageCopyResize($ni,$im,$dstX,$dstY,0,0,$fdstW,$fdstH,$srcW,$srcH); if($markwords!=null)
{
$markwords=iconv("gb2312","UTF-8",$markwords); //テキストエンコーディングを変換します
ImageTTFText($ni,20,30,450,560,$black,"simhei.ttf",$markwords); //テキストの透かしを書き込みます
//パラメータは次の順序です: テキスト サイズ | 偏向度 | 横座標 | 垂直座標 | テキストの色 | テキストの種類 | テキストの内容
}
elseif($markimage!=null)
{
$wimage_data = GetImageSize($markimage); スイッチ($wimage_data[2])
{
ケース 1:
$wimage=@ImageCreateFromGIF($markimage); 休憩
ケース 2:
$wimage=@ImageCreateFromJPEG($markimage); 休憩
ケース 3:
$wimage=@ImageCreateFromPNG($markimage); 休憩
}
imagecopy($ni,$wimage,500,560,0,0,88,31); //画像のウォーターマークを書き込みます、ウォーターマークの画像サイズ">デフォルトの画像サイズは 88*31 です
画像破壊($wimage)
}
ImageJpeg($ni,$dstFile,$rate); ImageJpeg($ni,$srcFile,$rate); 画像破壊($im); 画像破壊($ni); }
?>
例 4
$サムネイル = 新しいImageResize();
$thumbnail->resizeimage(ソース画像のフルパス、サムネイルの幅、サムネイルの高さ、トリミングするかどうか(0または1)、新しい画像のフルパス);
クラスImageResize {
//画像タイプ
var $type;
//実際の幅
var $width;
//実際の身長
var $height;
//変更された幅
var $resize_width;
//変更後の高さ
var $resize_height;
//画像をトリミングするかどうか
var $cut;
//ソース画像
var $srcimg;
//対象の画像アドレス
//一時的に作成した画像
var $im; 関数 Resizeimage($img, $wid, $hei,$c,$dstpath) {
$this->srcimg = $img;
$this->resize_width = $wid;
$this->resize_height = $hei;
$this->cut = $c;
//画像の種類
$this->type = strto lower(substr(strrchr($this->srcimg,"."),1));
//画像を初期化します
$this->initi_img();
//対象の画像アドレス
$this -> dst_img($dstpath);
//--
$this->width = imagex($this->im);
$this->height = imagey($this->im);
//画像を生成
$this->newimg();
ImageDestroy ($this->im);
}
関数 newimg() {
// 変更された画像の割合
$resize_ratio = ($this->resize_width)/($this->resize_height);
// 実際の画像の比率
$ratio = ($this->幅)/($this->高さ);
if(($this->cut)=="1") {
//裁图高优先
if($ratio>=$resize_ratio){
$newimg = imagecreatetruecolor($this->resize_width,$this->resize_height);
imagecopyresampled($newimg, $this->im, 0, 0, 0, 0, $this->resize_width,$this->resize_height, (($this->height)*$resize_ratio), $this ->身長);
ImageJpeg ($newimg,$this->dstimg);
}
//裁图宽度优先
if($ratio
$newimg = imagecreatetruecolor($this->resize_width,$this->resize_height);
imagecopyresampled($newimg, $this->im, 0, 0, 0, 0, $this->resize_width, $this->resize_height, $this->width, (($this->width) /$resize_ratio));
ImageJpeg ($newimg,$this->dstimg);
}
} その他 {
//不裁图
if($ratio>=$resize_ratio) {
$newimg = imagecreatetruecolor($this->resize_width,($this->resize_width)/$ratio);
imagecopyresampled($newimg, $this->im, 0, 0, 0, 0, $this->resize_width, ($this->resize_width)/$ratio, $this->width, $this->gt ;身長);
ImageJpeg ($newimg,$this->dstimg);
}
if($ratio
$newimg = imagecreatetruecolor(($this->resize_height)*$ratio,$this->resize_height);
imagecopyresampled($newimg, $this->im, 0, 0, 0, 0, ($this->resize_height)*$ratio, $this->resize_height, $this->width, $this-> ;身長);
ImageJpeg ($newimg,$this->dstimg);
}
}
}
//初期化图象
関数 initi_img() {
if($this->type=="jpg") {
$this->im = imagecreatefromjpeg($this->srcimg);
}
if($this->type=="gif") {
$this->im = imagecreatefromgif($this->srcimg);
}
if($this->type=="png") {
$this->im = imagecreatefrompng($this->srcimg);
}
if($this->type=="bmp") {
$this->im = $this->imagecreatefrombmp($this->srcimg);
}
}
//图象目标地址
関数 dst_img($dstpath) {
$full_length = strlen($this->srcimg);
$type_length = strlen($this->type);
$name_length = $full_length-$type_length;
$name = substr($this->srcimg,0,$name_length-1);
$this->dstimg = $dstpath;
//エコー $this->dstimg;
}
関数 ConvertBMP2GD($src, $dest = false) {
if(!($src_f = fopen($src, "rb"))) {
false を返します;
}
if(!($dest_f = fopen($dest, "wb"))) {
false を返します;
}
$header = unpack("vtype/Vsize/v2reserved/Voffset", fread($src_f,14));
$info = unpack("Vsize/Vwidth/Vheight/vplanes/vbits/Vcompression/Vimagesize/Vxres/Vyres/Vncolor/V important", fread($src_f, 40));
抽出($info);
抽出($header);
if($type != 0x4D42) { // 署名「BM」
false を返します;
}
$palette_size = $offset - 54;
$ncolor = $palette_size / 4;
$gd_header = "";
// トゥルーカラーとパレット
$gd_header .= ($palette_size == 0) ? "xFFxFE" : "xFFxFF";
$gd_header .= Pack("n2", $width, $height);
$gd_header .= ($palette_size == 0) ? "x01" : "x00";
if($palette_size) {
$gd_header .= Pack("n", $ncolor);
}
// 透明度なし
$gd_header .= "xFFxFFxFFxFF";
fwrite($dest_f, $gd_header);
if($palette_size) {
$palette = fread($src_f, $palette_size);
$gd_palette = "";
$j = 0;
while($j
$b = $palette{$j++};
$g = $palette{$j++};
$r = $パレット{$j++};
$a = $palette{$j++};
$gd_palette .= "$r$g$b$a";
}
$gd_palette .= str_repeat("x00x00x00x00", 256 - $ncolor);
fwrite($dest_f, $gd_palette);
}
$scan_line_size = (($bits * $width) + 7) >> 3;
$scan_line_align = ($scan_line_size & 0x03) ? 4 - ($scan_line_size &
0x03) : 0;
for($i = 0, $l = $height - 1; $i
// BMP はスキャンラインを下から順に保存します
fseek($src_f, $offset + (($scan_line_size + $scan_line_align) * $l));
$scan_line = fread($src_f, $scan_line_size);
if($bits == 24) {
$gd_scan_line = "";
$j = 0;
while($j
$b = $scan_line{$j++};
$g = $scan_line{$j++};
$r = $scan_line{$j++};
$gd_scan_line .= "x00$r$g$b";
}
}
else if($bits == 8) {
$gd_scan_line = $scan_line;
}
else if($bits == 4) {
$gd_scan_line = "";
$j = 0;
while($j
$byte = ord($scan_line{$j++});
$p1 = chr($byte >> 4);
$p2 = chr($byte & 0x0F);
$gd_scan_line .= "$p1$p2";
}
$gd_scan_line = substr($gd_scan_line, 0, $width);
}
else if($bits == 1) {
$gd_scan_line = "";
$j = 0;
while($j
$byte = ord($scan_line{$j++});
$p1 = chr((int) (($byte & 0x80) != 0));
$p2 = chr((int) (($byte & 0x40) != 0));
$p3 = chr((int) (($byte & 0x20) != 0));
$p4 = chr((int) (($byte & 0x10) != 0));
$p5 = chr((int) (($byte & 0x08) != 0));
$p6 = chr((int) (($byte & 0x04) != 0));
$p7 = chr((int) (($byte & 0x02) != 0));
$p8 = chr((int) (($byte & 0x01) != 0));
$gd_scan_line .= "$p1$p2$p3$p4$p5$p6$p7$p8";
}
$gd_scan_line = substr($gd_scan_line, 0, $width);
}
fwrite($dest_f, $gd_scan_line);
}
fclose($src_f);
fclose($dest_f);
true を返します;
}
function imagecreatefrombmp($filename) {
$tmp_name = tempnam("/tmp", "GD");
if($this->ConvertBMP2GD($filename, $tmp_name)) {
$img = imagecreatefromgd($tmp_name);
リンク解除($tmp_name);
$img を返します;
}
false を返します;
}
}