คราวที่แล้วผมพูดถึงการใช้ GD เพื่อสร้างรูปทรงเรขาคณิตต่างๆ และเติมสีสัน หนึ่งในสถานการณ์ที่ซับซ้อนกว่านั้นถูกจงใจทิ้งไว้ในภายหลัง ซึ่งก็คือสีเติมของรูปหลายเหลี่ยมตามอำเภอใจและรูปหลายเหลี่ยมตามใจชอบ
-
ส่วนหัว("ประเภทเนื้อหา: image/png");
$im = ImageCreate (200, 100);
$col_blk = ImageColorAllocate($im, 0,0,0);
$col_grn = ImageColorAllocate($im, 0,255,0);
$พาร์เรย์ = อาร์เรย์(40,10,60,10,70,20,60,50,40,50,30,20);
//กำหนดอาร์เรย์ที่มีสมาชิก 12 ตัวเป็นพิกัดแนวนอนและแนวตั้ง 6 จุด
ImagePolygon($im,$parray,6,$col_grn);
// นี่คือฟังก์ชันสำหรับการวาดรูปหลายเหลี่ยมตามอำเภอใจ $parray คืออาร์เรย์ที่เพิ่งกำหนด
// 6 หมายถึง หกแต้ม โปรดทราบว่าจุดหกจุดเชื่อมต่อกันเป็นรูปหกเหลี่ยม
// ไม่จำเป็นต้องเพิ่มจุดที่ส่วนท้ายที่เหมือนกับจุดแรกปลอมเพื่อปิดรูปร่าง
ImagePNG($IM);
ImageDestroy($im);
?>
คุณควรคิดถึงฟังก์ชันการเติมสีของรูปหลายเหลี่ยมใดๆ:
-
ส่วนหัว("ประเภทเนื้อหา: image/png");
$im = ImageCreate (200, 100);
$col_blk = ImageColorAllocate($im, 0,0,0);
$col_orn = ImageColorAllocate($im, 255,192,0);
$col_yel = ImageColorAllocate($im, 255,255,0);
$col_red = ImageColorAllocate($im, 255,0,0);
$col_grn = ImageColorAllocate($im, 0,255,0);
$col_blu = ImageColorAllocate($im, 0,0,255);
$parray = array(40,10,60,10,70,20,60,50,40,50,30,20);
ImageFilledPolygon($im,$parray,6,$col_grn);
ImagePNG($IM);
ImageDestroy($im);
?>
อืม. ตอนนี้เราสามารถเขียนลงบนภาพได้ แต่อย่าเพิ่งตื่นเต้นเกินไป การเขียนตัวอักษรจีนอาจมีปัญหาบ้าง
ซึ่งจะค่อยๆ อธิบายในภายหลัง มาดูวิธีการเขียนอักษรตะวันตกแบบง่ายๆ กันดีกว่า
-
ส่วนหัว("ประเภทเนื้อหา: image/png");
$im = สร้างภาพ (200, 250);
$col_blk = ImageColorAllocate($im, 0,0,0);
$col_orn = ImageColorAllocate($im, 255,192,0);
$str="นี่คือการทดสอบ";
ImageString($im,1,10,10,$str,$col_orn);
ImageString($im,2,10,30,$str,$col_orn);
ImageString($im,3,10,60,$str,$col_orn);
ImageString($im,4,10,100,$str,$col_orn);
ImageString($im,5,10,150,$str,$col_orn);
// ในที่นี้ ImageString ถูกเรียกห้าครั้งติดต่อกันในตำแหน่งที่ต่างกัน
//สตริง $str จะแสดงเป็นขนาดตัวอักษรตั้งแต่เล็กไปใหญ่
// ฟังก์ชั่น ImageString รองรับแบบอักษรเพียงห้าแบบเท่านั้น (1~5)
ImagePNG($IM);
ImageDestroy($im);
?>
ดูอีกครั้ง:
<?
//Header("ประเภทเนื้อหา: image/png");
$im = สร้างภาพ (200, 250);
$col_blk = ImageColorAllocate($im, 0,0,0);
$col_orn = ImageColorAllocate($im, 255,192,0);
$str="นี่คือการทดสอบ";
ImageStringUp($im,1,10,180,$str,$col_orn);
ImageStringUp($im,2,20,180,$str,$col_orn);
ImageStringUp($im,3,40,180,$str,$col_orn);
ImageStringUp($im,4,70,180,$str,$col_orn);
ImageStringUp($im,5,110,180,$str,$col_orn);
//ชื่อฟังก์ชันเปลี่ยนเป็น ImageStringUp และการใช้งานยังคงไม่เปลี่ยนแปลง
// คือการแสดงข้อความแนวตั้ง
ImagePNG($IM);
ImageDestroy($im);
?>
ในขณะที่ใช้ฟังก์ชันที่ส่งออกอักขระ หากคุณสามารถทราบความกว้างและความสูงที่อักขระประเภทแบบอักษรต่างๆ มีอยู่ในภาพได้
จะสะดวกแค่ไหนถ้าจัดตำแหน่งของอักขระเอาท์พุต! PHP ให้: ImageFontWidth() และ
ImageFontHeight() พารามิเตอร์ของมันง่ายมาก มีเพียงตัวเดียวเท่านั้น: จำนวนแบบอักษร ตัวอย่างเช่น ImageFontWidth(5)
เพื่อให้ได้ความกว้างของอักขระแต่ละตัวในแบบอักษรขนาด 5 และ ImageFontHeight(3) คือการได้รับความสูงของอักขระแต่ละตัวในแบบอักษรขนาด 3 มันง่ายมาก ดังนั้นฉันจะไม่ยกตัวอย่าง มันจะใช้ในโค้ดถัดไปในภายหลัง
คล้ายกับสตริงเอาต์พุต ImageChar และ ImageCharUp เอาต์พุตอักขระตัวเดียว มีการใช้น้อยกว่าและอาจไม่ได้ใช้ด้วยซ้ำ โดยไม่คำนึงถึงอักขระหรือสตริง เพียงใช้ ImageString และ ImageStringUp!
ต่อไป ฉันจะใช้ส่วนหนึ่งของโค้ดที่ฉันใช้วาดแผนภูมิการวิเคราะห์ K-line ของหุ้น เพื่อนำเนื้อหาที่กล่าวถึงข้างต้นไปใช้อย่างเป็นระบบ เนื่องจากเกี่ยวข้องกับฐานข้อมูล เราจึงไม่สามารถนำโค้ดต้นฉบับไปให้ทุกคนนำกลับไปทดสอบได้ เราสามารถสร้างข้อมูลบางส่วนเพื่อจำลองสภาวะตลาดหุ้นที่ได้รับจากฐานข้อมูลเท่านั้น เนื่องจากที่นี่อาจมีคนไม่มากที่เข้าใจหุ้น K-line คุณจึงอาจไม่รู้วิธีวาดกราฟ K-line อย่างไรก็ตาม ฉันไม่สามารถพูดถึงลักษณะเฉพาะของ K-line ที่นี่ได้ ฉันแนะนำได้เพียงหลายวิธีเท่านั้น หลังจากวาดเสร็จก็จะบอกได้เลยว่าเคยเห็นภาพแบบนี้มาก่อนแน่นอน
<?php
ส่วนหัว("ประเภทเนื้อหา: image/png");
$im = ImageCreate(640,260);
$bkground = ImageColorAllocate($im,255,255,255);
$data = ImageColorAllocate($im,0,0,0);
$gird = ImageColorAllocate($im,200,200,160);
$upline = ImageColorAllocate($im,255,0,0);
$dnline = ImageColorAllocate($im,0,175,175);
$d5line = ImageColorAllocate($im,255,127,0);
$d20line = ImageColorAllocate($im,0,0,127);
$d10line = ImageColorAllocate($im,255,0,255);
// ขั้นแรกให้กำหนดสีที่ใช้ในการวาดวัตถุต่างๆ
สำหรับ($i=20;$i<=220;$i+=25)
ImageLine($im, 60, $i, 560, $i, $gird);
สำหรับ($j=60;$j<=560;$j+=25)
ImageLine($im, $j, 20, $j, 220, $gird);
// คำนวณตำแหน่งและความกว้างของตารางล่วงหน้า และใช้ for loop เพื่อวาดเส้น ซึ่งช่วยลดปัญหาได้มาก
$zzg=10.55;
$zzd=7.63;
$lzg=10350;
// ข้อมูลตลาดหุ้นสมมุติ
// $zzg คือราคาสูงสุดในช่วงเวลาที่จะวิเคราะห์ โดยสมมติว่าอยู่ที่ 10.55 หยวน
//$zzd คือราคาต่ำสุดในช่วงเวลาที่จะวิเคราะห์ โดยสมมติว่าอยู่ที่ 7.63 หยวน
// $lzg คือปริมาณการซื้อขายสูงสุดในช่วงเวลาที่ต้องวิเคราะห์ โดยสมมติว่าเป็น 10350 ล็อต
// นี่เป็นข้อมูลสำคัญสำหรับการคำนวณ "ขีด" ของตารางพิกัด
$bl=$zzg-$zzd;
// ความแตกต่างระหว่างราคาสูงสุดและราคาต่ำสุด ตามอัตราส่วนของความสูงรวมของตาราง จะได้ว่า
// คุณสามารถรับตำแหน่งราคาจริงได้ในตาราง
สำหรับ($i=1;$i<=7;$i++)
-
$y=$i*25-10;
// คำนวณความสูงที่เหมาะสม (พิกัด) ของมาตราส่วนฉลากตามตำแหน่งของเส้นตาราง
$str=Number_Format($zzg-($i-1)/6*$bl,2,".",",");
// คำนวณราคาที่สอดคล้องกับแต่ละเครื่องหมายถูกและจัดรูปแบบสตริง
$x=55-ImageFontWidth(2)*StrLen($str);
// คำนวณ Abscissa ที่เหมาะสมตามความกว้างที่สตริงนี้จะครอบครอง
ImageString($im, 2,$x, $y,$str, $data);
//เขียนสตริงนี้
}
$str=Number_Format($lzg,0,".",",");
ImageString($im,2,564,164,$str,$data);
$str=Number_Format($lzg/2,0,".",",");
ImageString($im,2,564,189,$str,$data);
// เนื่องจากการเขียนปริมาณการซื้อขายมีเพียงสองระดับ การเขียนวนซ้ำจึงไม่คุ้มค่า
// ถ้าจำนวนค่อนข้างมาก ก็ควรใช้การวนซ้ำด้วย
// เนื่องจากแผนภูมิ K-line จำเป็นต้องวาดแท่ง K-line ขนาดเล็กจำนวนนับไม่ถ้วน ให้วาดแท่ง K-line ขนาดเล็กเป็นฟังก์ชัน
ฟังก์ชันไคลน์($img,$kp,$zg,$zd,$sp,$cjl,$ii)
// พารามิเตอร์: $img image; $kp $zg $zd $sp คือราคาเปิด, สูงสุด, ต่ำสุด และราคาปิด;
// $cjl ปริมาณการซื้อขาย; $ii ตัวนับ, ระบุหมายเลขซีเรียลของแถบ K-line
-
ทั่วโลก $bl,$zzd,$lzg;
// ประกาศตัวแปรสามตัว $bl, $zzd และ $lzg ที่ใช้ในฟังก์ชันนี้เป็นตัวแปรโกลบอล
$h=150; //ความสูงของพื้นที่คอลัมน์ K-line คือ 150
$hh=200; //ความสูงรวมของพื้นที่คอลัมน์ K-line และพื้นที่คอลัมน์ปริมาตรคือ 200
ถ้า($sp<$kp)
$linecolor = ImageColorAllocate($img,0,175,175);
// หากราคาปิดต่ำกว่าราคาเปิดจะเป็นเส้นลบสีฟ้า
อื่น
$linecolor = ImageColorAllocate($img,255,0,0);
// มิฉะนั้นจะเป็นเส้นบวกให้ใช้สีแดง
$x=58+$ii*4;
// คำนวณ Abscissa ตามหมายเลขแท่ง K-line
$y1=20+$h-($kp-$zzd)/$bl*$h;
// คำนวณพิกัดแนวตั้งที่สอดคล้องกันตามราคาเปิด
$y2=20+$h-($sp-$zzd)/$bl*$h;
// คำนวณพิกัดแนวตั้งที่สอดคล้องกันตามราคาปิด
$y3=20+$h-($zg-$zzd)/$bl*$h;
// คำนวณพิกัดแนวตั้งที่สอดคล้องกันตามราคาสูงสุด
$y4=20+$h-($zd-$zzd)/$bl*$h;
// คำนวณพิกัดแนวตั้งที่สอดคล้องกันตามราคาต่ำสุด
$y5=20+$hh-$cjl/$lzg*($hh-$h);
// คำนวณพิกัดแนวตั้งที่สอดคล้องกันตามปริมาณการซื้อขาย
if($y1<=$y2) ImageFilledRectangle($img,$x-1,$y1,$x+1,$y2,$linecolor);
อื่น ImageFilledRectangle($img,$x-1,$y2,$x+1,$y1,$linecolor);
//แอบซิสซาคือลบ 1 ถึงบวก 1 และสแปนคือ 3 นั่นคือวาดรูปสี่เหลี่ยมผืนผ้าเล็ก ๆ ที่มีความกว้าง 3
//ความสูงและพิกัดแนวตั้งถูกกำหนดโดยราคาเปิดและราคาปิด
// หลังจากทดสอบแล้วพบว่าฟังก์ชันนี้จะต้องเขียนพิกัดของจุดซ้ายบนก่อนพิกัดของจุดขวาล่าง
// แทนที่จะตัดสินโดยอัตโนมัติว่าจุดใดในสองจุดคือซ้ายบนหรือขวาล่าง
ImageFilledRectangle($img,$x-1,$y5,$x+1,220,$linecolor);
//วาดกระบอกปริมาตรตามปริมาณการซื้อขาย
ImageLine($img,$x,$y3,$x,$y4,$linecolor);
// วาดเส้นเงาบนและล่างตามราคาสูงสุดและราคาต่ำสุด
}
// ลองวาดอันหนึ่งดู เปิดอยู่ที่ 8.50 สูงสุดคือ 8.88 ต่ำสุดคือ 8.32 และปิดอยู่ที่ 8.80 โดยมีการซื้อขาย 6,578 ล็อต
ไคลน์($im,8.50,8.88,8.32,8.80,6578,1);
//วาดอีกอัน เปิดอยู่ที่ 8.80 สูงสุดคือ 9.50 ต่ำสุดคือ 8.80 และปิดอยู่ที่ 9.50 โดยมีการซื้อขาย 8,070 ล็อต
// ช่างเป็น Yangxian ที่ยอดเยี่ยมจริงๆ ที่มีหัวเปล่าและเท้าเปล่า!
ไคลน์($im,8.80,9.50,8.80,9.50,8070,2);
// อีกบรรทัดลบ เปิดอยู่ที่ 9.80 สูงสุดคือ 9.80 ต่ำสุดคือ 8.90 และปิดอยู่ที่ 9.06 โดยมีการซื้อขาย 10,070 ล็อต
// จ่าย! มันดีแค่ไหนที่ได้ทิ้งมันไปเมื่อวานนี้
kline($im,9.80,9.80,8.90,9.06,10070,3);
// ……
ImagePNG($im);
ImageDestroy($im);
-
แน่นอนว่าการเขียนข้อมูลเช่นนี้ในแต่ละวันคงเป็นเรื่องยากเกินไป สิ่งที่ฉันทำคือดึงข้อมูลจากฐานข้อมูล
นั่นคือทั้งหมดสำหรับครั้งนี้