La última vez hablé sobre el uso de GD para crear varias formas geométricas y colores de relleno. Una de las situaciones más complicadas se deja deliberadamente para más adelante, que es el color de relleno de polígonos arbitrarios y polígonos arbitrarios.
<?
Encabezado("Tipo de contenido: imagen/png");
$im = Crear Imagen (200, 100);
$col_blk = ImageColorAllocate($im, 0,0,0);
$col_grn = ImageColorAllocate($im, 0,255,0);
$parray = matriz(40,10,60,10,70,20,60,50,40,50,30,20);
//Definir una matriz cuyos 12 miembros son las coordenadas horizontales y verticales de 6 puntos.
ImagePolygon($im,$parray,6,$col_grn);
// Esta es la función para dibujar polígonos arbitrarios $parray es la matriz que se acaba de definir.
// 6 significa seis puntos. Tenga en cuenta que los seis puntos conectados forman un hexágono.
// No es necesario agregar artificialmente un punto al final que sea igual al primer punto para cerrar la forma.
ImagenPNG($im);
ImageDestroy($im);
?>
Deberías haber pensado en la función de rellenar el color de cualquier polígono:
<?
Encabezado("Tipo de contenido: imagen/png");
$im = Crear Imagen (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 = matriz(40,10,60,10,70,20,60,50,40,50,30,20);
ImageFilledPolygon($im,$parray,6,$col_grn);
ImagenPNG($im);
ImageDestroy($im);
?>
Mmm. Ahora podemos escribir sobre la imagen. Pero no te emociones demasiado todavía, escribir caracteres chinos te llevará algunos problemas.
Esto se explicará gradualmente más adelante. Echemos un vistazo a cómo escribir caracteres occidentales de forma sencilla.
<?
Encabezado("Tipo de contenido: imagen/png");
$im = Crear Imagen (200, 250);
$col_blk = ImageColorAllocate($im, 0,0,0);
$col_orn = ImageColorAllocate($im, 255,192,0);
$str="Esto es una prueba.";
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);
// Aquí, se llama a ImageString cinco veces seguidas, en diferentes ubicaciones.
//La cadena $str se genera en tamaños de fuente de pequeño a grande.
// La función ImageString solo admite cinco fuentes (1~5)
ImagenPNG($im);
ImageDestroy($im);
?>
Mira de nuevo:
<?
//Encabezado("Tipo de contenido: imagen/png");
$im = Crear Imagen (200, 250);
$col_blk = ImageColorAllocate($im, 0,0,0);
$col_orn = ImageColorAllocate($im, 255,192,0);
$str="Esto es una prueba.";
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);
// El nombre de la función se cambia a ImageStringUp y el uso permanece sin cambios.
// es generar texto vertical.
ImagenPNG($im);
ImageDestroy($im);
?>
Mientras usa la función que genera caracteres, si puede saber el ancho y alto que ocupan los caracteres de diferentes tipos de fuente en la imagen,
¡Qué conveniente sería organizar la posición de los caracteres de salida! PHP nos proporciona: ImageFontWidth() y
ImageFontHeight(), su parámetro es muy simple, solo hay uno: el número de la fuente. Por ejemplo ImageFontWidth(5)
Es para obtener el ancho de cada carácter de fuente de tamaño 5, e ImageFontHeight(3) es para obtener la altura de cada carácter de fuente de tamaño 3. Es muy simple, por lo que no daré un ejemplo. Se usará en el código siguiente.
De manera similar a generar cadenas, ImageChar e ImageCharUp generan un solo carácter. Tienen menos usos y es posible que ni siquiera se usen; independientemente de los caracteres o cadenas, ¡solo use ImageString e ImageStringUp!
A continuación, utilizaré parte del código que he utilizado para dibujar gráficos de análisis de línea K de acciones para aplicar sistemáticamente el contenido mencionado anteriormente. Debido a que se trata de una base de datos, no podemos traer el código original para que todos lo lleven para probarlo. Solo podemos construir algunos datos para simular las condiciones del mercado de valores obtenidos de la base de datos. Dado que puede que no haya mucha gente aquí que entienda la línea K de las acciones, es posible que no sepa cómo dibujar el gráfico de la línea K. Sin embargo, aquí no puedo hablar sobre los detalles de K-line. Solo puedo presentar una serie de métodos. Una vez que termines el dibujo, definitivamente podrás darte cuenta de que has visto imágenes como esta antes.
<?php
Encabezado("Tipo de contenido: imagen/png");
$im = ImageCreate(640,260);
$bkground = ImageColorAllocate($im,255,255,255);
$datos = ImageColorAllocate($im,0,0,0);
$gird = ImageColorAllocate($im,200,200,160);
$línea ascendente = 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);
// Primero define los colores utilizados para dibujar varios objetos.
para($i=20;$i<=220;$i+=25)
ImageLine($im, 60, $i, 560, $i, $gird);
por($j=60;$j<=560;$j+=25)
ImageLine($im, $j, 20, $j, 220, $gird);
// Calcule la posición y el ancho de la cuadrícula de antemano y use un bucle for para dibujar la línea, lo que ahorra muchos problemas.
$zzg=10,55;
$zzd=7,63;
$lzg=10350;
// Datos hipotéticos del mercado de valores,
// $zzg es el precio más alto durante el período a analizar, suponiendo que sea 10,55 yuanes.
//$zzd es el precio más bajo durante el período a analizar, suponiendo que sea 7,63 yuanes.
// $lzg es el volumen de operaciones más alto durante el período que debe analizarse, suponiendo que sean 10350 lotes.
// Estos son datos importantes para calcular el "tic" de la cuadrícula de coordenadas.
$bl=$zzg-$zzd;
// La diferencia entre el precio más alto y el precio más bajo. Según su relación con la altura total de la rejilla,
// Puedes obtener una posición de precio real en la grilla.
para($i=1;$i<=7;$i++)
{
$y=$i*25-10;
// Calcule la altura (ordenada) apropiada de la escala de la etiqueta según la posición de las líneas de la cuadrícula.
$cadena=Number_Format($zzg-($i-1)/6*$bl,2,".",",");
// Calcula el precio correspondiente a cada marca y formatea la cadena.
$x=55-ImageFontWidth(2)*StrLen($str);
// Calcula la abscisa adecuada en función del ancho que ocupará esta cadena.
ImageString($im, 2,$x, $y,$cadena, $datos);
//Escribe esta cadena.
}
$cadena=Number_Format($lzg,0,".",",");
ImageString($im,2,564,164,$cadena,$datos);
$cadena=Number_Format($lzg/2,0,".",",");
ImageString($im,2,564,189,$cadena,$datos);
// Dado que solo hay dos escalas para escribir el volumen de operaciones, no es rentable escribir en un bucle.
// Si el número es relativamente grande, también se debe utilizar un bucle.
// Dado que un gráfico de líneas K requiere dibujar innumerables barras pequeñas de líneas K, dibuje una pequeña barra de líneas K como función
función kline($img,$kp,$zg,$zd,$sp,$cjl,$ii)
// Parámetros: $img image; $kp $zg $zd $sp es el precio de apertura, el más alto, el más bajo y el de cierre;
// $cjl volumen de operaciones; contador $ii, que indica el número de serie de la barra de la línea K.
{
global $bl,$zzd,$lzg;
// Declara las tres variables $bl, $zzd y $lzg utilizadas en esta función como variables globales.
$h=150; //La altura del área de la columna de la línea K es 150.
$hh=200; //La altura total del área de la columna de la línea K y el área de la columna de volumen es 200.
si($sp<$kp)
$linecolor = ImageColorAllocate($img,0,175,175);
// Si el precio de cierre es inferior al precio de apertura, es una línea negativa, de color cian
demás
$linecolor = ImageColorAllocate($img,255,0,0);
// De lo contrario, es una línea positiva, usa rojo.
$x=58+$ii*4;
// Calcula la abscisa según el número de barra de la línea K.
$y1=20+$h-($kp-$zzd)/$bl*$h;
// Calcula la coordenada vertical correspondiente en función del precio de apertura.
$y2=20+$h-($sp-$zzd)/$bl*$h;
// Calcula la coordenada vertical correspondiente en función del precio de cierre.
$y3=20+$h-($zg-$zzd)/$bl*$h;
// Calcula la coordenada vertical correspondiente en función del precio más alto.
$y4=20+$h-($zd-$zzd)/$bl*$h;
// Calcula la coordenada vertical correspondiente en función del precio más bajo.
$y5=20+$hh-$cjl/$lzg*($hh-$h);
// Calcule la coordenada vertical correspondiente en función del volumen de negociación.
if($y1<=$y2) ImageFilledRectangle($img,$x-1,$y1,$x+1,$y2,$linecolor);
else ImageFilledRectangle($img,$x-1,$y2,$x+1,$y1,$linecolor);
// La abscisa es menos 1 a más 1 y el intervalo es 3. Es decir, dibuja un pequeño rectángulo relleno con un ancho de 3.
//La altura y la coordenada vertical están determinadas por los precios de apertura y cierre.
// Después de la prueba, se descubrió que esta función debe escribir las coordenadas del punto superior izquierdo antes de las coordenadas del punto inferior derecho.
// En lugar de juzgar automáticamente cuál de los dos puntos es el superior izquierdo o el inferior derecho.
ImageFilledRectangle($img,$x-1,$y5,$x+1,220,$linecolor);
//Dibuja el cilindro de volumen según el volumen de operaciones.
ImageLine($img,$x,$y3,$x,$y4,$linecolor);
// Dibuja líneas de sombra superior e inferior según el precio más alto y el precio más bajo.
}
// Intenta dibujar uno. La apertura fue 8,50, la más alta fue 8,88, la más baja fue 8,32 y el cierre fue 8,80, con 6578 lotes negociados.
kline($im,8.50,8.88,8.32,8.80,6578,1);
//Dibuja otro. La apertura fue 8,80, la más alta fue 9,50, la más baja fue 8,80 y el cierre fue 9,50, con 8.070 lotes negociados.
// ¡Qué gran Yangxian con la cabeza y los pies descalzos!
kline($im,8,80,9,50,8,80,9,50,8070,2);
// Otra línea negativa. La apertura fue 9,80, la más alta fue 9,80, la más baja fue 8,90 y el cierre fue 9,06, con 10.070 lotes negociados.
// ¡Pagado! Qué lindo fue tirarlo ayer.
kline($im,9.80,9.80,8.90,9.06,10070,3);
// ……
ImagenPNG($im);
ImageDestroy($im);
?>
Por supuesto, sería demasiado problemático escribir datos como este para todos los días. Lo que hago es recuperar datos de la base de datos.
Eso es todo por este momento.