지난번에는 GD를 사용하여 다양한 기하학적 모양을 만들고 색상을 채우는 방법에 대해 이야기했습니다. 더 복잡한 상황 중 하나는 임의의 다각형과 임의의 다각형의 채우기 색상인 나중을 위해 의도적으로 남겨둔 것입니다.
<?
Header("콘텐츠 유형: 이미지/png");
$im = 이미지 생성(200, 100);
$col_blk = ImageColorAllocate($im, 0,0,0);
$col_grn = ImageColorAllocate($im, 0,255,0);
$parray = 배열(40,10,60,10,70,20,60,50,40,50,30,20);
//6개 점의 수평 및 수직 좌표인 12개의 멤버로 구성된 배열을 정의합니다.
ImagePolygon($im,$parray,6,$col_grn);
// 임의의 다각형을 그리는 함수입니다. $parray는 방금 정의한 배열입니다.
// 6은 6개의 점을 의미합니다. 연결된 6개의 점은 육각형을 형성합니다.
// 도형을 닫기 위해 첫 번째 점과 동일한 끝점을 인위적으로 추가할 필요는 없습니다.
이미지PNG($im);
ImageDestroy($im);
?>
모든 다각형의 색상을 채우는 기능을 생각했어야 합니다.
<?
Header("콘텐츠 유형: 이미지/png");
$im = 이미지 생성(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 = 배열(40,10,60,10,70,20,60,50,40,50,30,20);
ImageFilledPolygon($im,$parray,6,$col_grn);
이미지PNG($im);
ImageDestroy($im);
?>
흠. 이제 이미지에 글을 쓸 수 있습니다. 하지만 아직 너무 흥분하지 마세요. 한자를 쓰는 데는 약간의 어려움이 있을 것입니다.
이에 대해서는 나중에 차차 설명하겠습니다. 서양글자를 간단하게 쓰는 방법을 살펴보겠습니다.
<?
Header("콘텐츠 유형: 이미지/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은 서로 다른 위치에서 연속으로 5번 호출됩니다.
//문자열 $str은 작은 글꼴 크기에서 큰 글꼴 크기로 출력됩니다.
// ImageString 함수는 5가지 글꼴(1~5)만 지원합니다.
이미지PNG($im);
ImageDestroy($im);
?>
다시 보세요:
<?
//Header("콘텐츠 유형: 이미지/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으로 변경되고 사용법은 그대로 유지됩니다.
// 세로 텍스트를 출력하는 것입니다.
이미지PNG($im);
ImageDestroy($im);
?>
문자를 출력하는 기능을 사용하면서, 이미지에서 다양한 글꼴 유형의 문자가 차지하는 너비와 높이를 알 수 있다면,
출력되는 문자의 위치를 정리하면 얼마나 편리할까요! PHP는 다음을 제공합니다: ImageFontWidth() 및
ImageFontHeight()의 매개변수는 매우 간단하며 글꼴 번호 하나만 있습니다. 예를 들어 ImageFontWidth(5)
이는 크기 5 글꼴의 각 문자의 너비를 가져오는 것이고, ImageFontHeight(3)는 크기 3 글꼴의 각 문자의 높이를 가져오는 것입니다. 너무 간단하므로 나중에 예제를 제공하지 않겠습니다.
문자열 출력과 유사하게 ImageChar 및 ImageCharUp은 단일 문자를 출력합니다. 용도가 적고 사용되지 않을 수도 있습니다. 문자나 문자열에 관계없이 ImageString 및 ImageStringUp을 사용하면 됩니다.
다음으로는 위에서 언급한 내용을 체계적으로 적용하기 위해 주식 K-라인 분석 차트를 그리는 데 사용한 코드의 일부를 사용하겠습니다. 이는 데이터베이스와 관련되어 있기 때문에 모든 사람이 테스트를 위해 가져갈 수 있도록 원본 코드를 가져올 수는 없습니다. 데이터베이스에서 얻은 주식 시장 상황을 시뮬레이션하기 위해 일부 데이터만 구성할 수 있습니다. 여기에는 주식 K라인을 이해하는 사람이 많지 않기 때문에 K라인 차트를 어떻게 그리는지 모를 수도 있습니다. 하지만 여기서는 K-line의 구체적인 내용을 이야기할 수는 없지만 일련의 방법만 소개할 뿐입니다. 그림을 다 그린 후에는 이전에 이런 그림을 본 적이 있다는 것을 확실히 알 수 있을 것입니다.
<?php
Header("콘텐츠 유형: 이미지/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);
// 먼저 다양한 객체를 그리는 데 사용되는 색상을 정의합니다.
for($i=20;$i<=220;$i+=25)
ImageLine($im, 60, $i, 560, $i, $gird);
for($j=60;$j<=560;$j+=25)
ImageLine($im, $j, 20, $j, 220, $gird);
// 위치와 그리드 너비를 미리 계산하고 for 루프를 사용하여 선을 그리므로 많은 수고가 줄어듭니다.
$zzg=10.55;
$zzd=7.63;
$lzg=10350;
// 가상의 주식 시장 데이터,
// $zzg는 10.55위안으로 가정했을 때 분석 대상 기간 동안의 최고 가격입니다.
//$zzd는 7.63위안으로 가정하여 분석 대상 기간 중 최저가입니다.
// $lzg는 10350랏으로 가정할 때, 분석 대상 기간 동안의 최고 거래량입니다.
// 좌표그리드의 "틱"을 계산하는데 중요한 데이터입니다.
$bl=$zzg-$zzd;
//최고가와 최저가의 차이. 그리드의 전체 높이에 대한 비율에 따라,
// 그리드에서 실제 가격 위치를 얻을 수 있습니다.
for($i=1;$i<=7;$i++)
{
$y=$i*25-10;
// 그리드 선의 위치를 기준으로 라벨 눈금의 적절한 높이(좌표)를 계산합니다.
$str=Number_Format($zzg-($i-1)/6*$bl,2,".",",");
// 각 눈금 표시에 해당하는 가격을 계산하고 문자열 형식을 지정합니다.
$x=55-ImageFontWidth(2)*StrLen($str);
// 이 문자열이 차지할 너비를 기준으로 적절한 가로좌표를 계산합니다.
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);
// 거래량을 쓰는 척도가 2개밖에 없기 때문에 루프로 쓰는 것은 비용 효율적이지 않습니다.
// 숫자가 상대적으로 크면 루프도 사용해야 합니다.
// K-라인 차트는 셀 수 없이 많은 작은 K-라인 막대를 그려야 하므로 함수로 작은 K-라인 막대를 그립니다.
함수 kline($img,$kp,$zg,$zd,$sp,$cjl,$ii)
// 매개변수: $img image; $kp $zg $zd $sp는 개시가, 최고가, 최저가, 종가입니다.
// $cjl 거래량; $ii 카운터, K-라인 바의 일련번호를 나타냅니다.
{
글로벌 $bl,$zzd,$lzg;
// 이 함수에서 사용하는 변수 $bl, $zzd, $lzg 3개를 전역 변수로 선언합니다.
$h=150; //K라인 컬럼 영역의 높이는 150입니다.
$hh=200; //K라인 컬럼 영역과 볼륨 컬럼 영역의 총 높이는 200입니다.
if($sp<$kp)
$linecolor = ImageColorAllocate($img,0,175,175);
// 종가가 시가보다 낮으면 음수선이 되며 청록색으로 표시됩니다.
또 다른
$linecolor = ImageColorAllocate($img,255,0,0);
// 그렇지 않으면 양수 라인이므로 빨간색을 사용합니다.
$x=58+$ii*4;
// K-라인 막대 번호를 기준으로 가로좌표를 계산합니다.
$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);
else 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랏이 거래되었습니다.
kline($im,8.50,8.88,8.32,8.80,6578,1);
//하나 더 그립니다. 시가는 8.80, 최고는 9.50, 최저는 8.80, 종가는 9.50으로 8,070랏이 거래되었습니다.
// 머리도 맨발도 맨발은 정말 대단한 양현이군요!
kline($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);
?>
물론, 매일 이렇게 데이터를 작성하는 것은 너무 번거로울 것입니다. 내가 하는 일은 데이터베이스에서 데이터를 가져오는 것입니다.
이번에는 그게 전부입니다.