PHP Classes

File: array_to_image.php

Recommend this page to a friend!
  Classes of Roberto   array_to_image   array_to_image.php   Download  
File: array_to_image.php
Role: ???
Content type: text/plain
Description: Class file
Class: array_to_image
Author: By
Last change:
Date: 22 years ago
Size: 12,438 bytes
 

Contents

Class file image Download
<?php // // Class to render array as image // /** * * Class array_to_image: show a bidimensional array as an image representing * a table. Allows: * - set max image size and automatly resize if the resulting image is to big * - different background and text color for head and rows * - alternate background abd text color for even and odd rows * - PNG or JPG format * - store to files or show directly * * @author Roberto 'Frank' Franchini <f.rank@libero.it> * @version 1.1 * */ class array_to_image { /** * Array to be showed * @var array * @access public */ var $arr; /** * Image handle * @var handler * @access private */ var $image; /** * Fonts and colors parameters * @var font * @access private */ var $font; var $fontWidth; var $even_bgcolor; var $even_txt_color; var $odd_bgcolor; var $odd_txt_color; var $head_bgcolor; var $head_txt_color; var $line_color; //options var $cellspacing; var $center; //if true center the text var $max_x; //max dimension var $max_y; var $type; //private parameters (calculated) var $rows; //number of rows and columns var $cols; var $dim_x; //width and height in pixel of the resulting image var $dim_y; var $row_height; //height of each row in pixel //it's all OK? var $flag; //constructor function array_to_image($arr=array(), $font=2, $cellspacing=5, $center=true, $max_x=600, $max_y=600, $type='png', $line_color="0,0,0", $head_bgcolor="128,128,128", $head_txt_color="0,0,0", $even_bgcolor="230,230,230", $even_txt_color="0,0,0", $odd_bgcolor="214,214,214", $odd_txt_color="0,0,0") { $this->arr = $arr; $this->font = $font; $this->even_bgcolor = $this->_setcolor($even_bgcolor); $this->even_txt_color = $this->_setcolor($even_txt_color); $this->odd_bgcolor = $this->_setcolor($odd_bgcolor); $this->odd_txt_color = $this->_setcolor($odd_txt_color); $this->head_bgcolor = $this->_setcolor($head_bgcolor); $this->head_txt_color = $this->_setcolor($head_txt_color); $this->line_color = $this->_setcolor($line_color); $this->cellspacing = $cellspacing; $this->center = $center; $this->max_x = $max_x; $this->max_y = $max_y; $this->type = $type; $this->rows = 0; $this->cols = 0; $this->dim_x = 0; $this->dim_y = 0; $this->flag = 1; $this->image = 0; } //end constructor //destructor function _array_to_image() { $this->arr = null; $this->font = null; $this->even_bgcolor = null; $this->even_txt_color = null; $this->odd_bgcolor = null; $this->odd_txt_color = null; $this->head_bgcolor = null; $this->head_txt_color = null; $this->line_color = null; $this->cellspacing = null; $this->center = null; $this->max_x = null; $this->max_y = null; $this->type = null; $this->rows = 0; $this->cols = 0; $this->dim_x = 0; $this->dim_y = 0; $this->flag = 1; } //end constructor /** * Show or store to the given file name the image * in the selected format. It calls _image_create() if * the handle isn't setted, and then calls _draw_table() * that draws the table on the handle. * * @param string $name name of file where to store the image * @param bool $destroy tells if the image handle should be destoyed * @access public * @returns image png or jpg image if $name is setted */ function show_image($nome='', $destroy=true) { if (!$this->image) { $this->_create_image(); } $this->_draw_table(); switch ($this->type) { case 'png': if ($nome) { imagepng($this->image,$nome.".png"); } else { header("Content-type: image/png"); imagepng($this->image); } break; case 'jpeg': if ($nome) { imagejpeg ($this->image,$nome.".jpg"); } else { header ("Content-type: image/jpeg"); imagejpeg ($this->image); } break; } if ($destroy == true) { $this->_array_to_image(); imagedestroy($this->image); } } //end func show_image /** * Create an associative array for color values * * @param sting $color comma separated value for Red,Green,Blue * @access private * @returns associative arrary of colors */ function _setcolor($color) { $color = explode(",",$color); $red = $color[0]; $green = $color[1]; $blue = $color[2]; return (array(red=>$red,green=>$green,blue=>$blue)); } /** * Set colors for all types of cells * * @access private * @returns none */ function _set_cells_color() { //setto i colori $this->even_bgcolor = imagecolorallocate($this->image, $this->even_bgcolor[red], $this->even_bgcolor[green], $this->even_bgcolor[blue] ); $this->even_txt_color = imagecolorallocate($this->image, $this->even_txt_color[red], $this->even_txt_color[green], $this->even_txt_color[blue] ); $this->odd_bgcolor = imagecolorallocate($this->image, $this->odd_bgcolor[red], $this->odd_bgcolor[green], $this->odd_bgcolor[blue] ); $this->odd_txt_color = imagecolorallocate($this->image, $this->odd_txt_color[red], $this->odd_txt_color[green], $this->odd_txt_color[blue] ); $this->line_color = imagecolorallocate($this->image, $this->line_color[red], $this->line_color[green], $this->line_color[blue] ); $this->head_bgcolor = imagecolorallocate($this->image, $this->head_bgcolor[red], $this->head_bgcolor[green], $this->head_bgcolor[blue] ); $this->head_txt_color = imagecolorallocate($this->image, $this->head_txt_color[red], $this->head_txt_color[green], $this->head_txt_color[blue] ); $line_color = imagecolorallocate($this->image, $this->line_color[red], $this->line_color[green], $this->line_color[blue] ); } //end func _setcolor /** * Create the image and if necesary resize it to fit the * max dimension required. This method only allocates graphic space * where to draw the table * * @access private * @returns none */ function _create_image() { if ((!$this->cols) || (!$this->rows)) $this->_max_cells_width(); if ((!$this->dim_x) || (!$this->dim_y)) $this->_image_dimension(); //if calculated dimension of resulting image are bigger than // max dimension, drop down font dimension and cellspacing while (($this->dim_x > $this->max_x) or ($this->dim_y > $this->max_y) and ($this->font > 1 or $this->cellspacing > 1 )) { $this->cellspacing = ($this->cellspacing > 1) ? $this->cellspacing-1 : 1; $this->font = ($this->font > 1) ? $this->font-1 : 1; $this->_max_cells_width(); $this->_image_dimension(); } //now i can create the image $this->image = imagecreate($this->dim_x, $this->dim_y); $this->_set_cells_color(); } //end func _create_image /** * Draw the table as image. Doesn't show any output. * * @access private * @returns none */ function _draw_table() { $y2 = 0; $x2 = 0; reset($this->arr); $y1 = 0; $even = true; while (list($rowKey,$row) = each($this->arr) ) { $x1 = 0; if ($rowKey =='width') continue; /*'for' statement is necessary for draw cell's rectangle * on empty cells * This 'while' statement will not round empty cells: * while (list($colKey,$element) = each ($row)) { */ for ($colKey = 0; $colKey < $this->cols ; $colKey++) { $element = $this->arr[$rowKey][$colKey]; $col_width = $this->arr['width'][$colKey] * $this->fontWidth + 2*$this->cellspacing; $string = $element; if ($this->center) { $str_width = strlen($string) * $this->fontWidth; $shift = ($col_width - $str_width) / 2 - $this->cellspacing; } $x2 = $x1 + $col_width; $y2 = $y1 + $this->row_height; //if index point to table's head apply style if ($rowKey == 'head') { imagefilledrectangle($this->image, $x1, $y1, $x2, $y2, $this->head_bgcolor); ImageString($this->image, $this->font, $x1+$this->cellspacing+$shift, $y1+$this->cellspacing, $string, $this->head_txt_color); } elseif ($even) { imagefilledrectangle($this->image, $x1, $y1, $x2, $y2, $this->even_bgcolor); ImageString($this->image, $this->font, $x1+$this->cellspacing+$shift, $y1+$this->cellspacing, $string, $this->even_txt_color); } else { imagefilledrectangle($this->image, $x1, $y1, $x2, $y2, $this->odd_bgcolor); ImageString($this->image, $this->font, $x1+$this->cellspacing+$shift, $y1+$this->cellspacing, $string, $this->odd_txt_color); } imagerectangle($this->image, $x1, $y1, $x2, $y2, $this->line_color); $x1 = $x2; //next column } $y1 = $y2; //next row $even = !$even; } } //end func _draw_table /** * Claculate the pixel lenght and widht of resulting image * and set the parameters dim_x and dim_y * * @access private * @return bool */ function _image_dimension() { $this->fontWidth = imagefontwidth($this->font); $font_height = imagefontheight($this->font); $tot_char_width = 0; //total width of array in character if (($this->cols == 0) || ($this->rows == 0)) { $this->_max_cells_width(); } reset($this->arr); while (list($i,$num_char) = each($this->arr['width'])) { $tot_char_width += $num_char; } $this->row_height = $font_height + 2 * $this->cellspacing ; //resulting image's dimension in pixel $this->dim_x = $tot_char_width * $this->fontWidth + $this->cols * 2 * $this->cellspacing + 1; $this->dim_y = ($this->rows-1) * ($this->row_height) + 1; return($this->flag); } /** * Calculate the maximun width as number of character * for each column of the original bidimensional array * It adds a row to the array : * $this->array[width] = array(); * and then sets the parameters $rows, $cols * * @access private * @returns void */ function _max_cells_width() { $this->arr['width'] = array(); $this->rows = 0; $this->cols = 0; reset($this->arr); while (list($row_key,$row) = each($this->arr)) { while (list($col_key,$elem) = each($row)) { $width = strlen($elem); if (($this->arr['width'][$col_key] < $width) and ($row_key != 'width')) { $this->arr['width'][$col_key] = $width; } } $this->rows++; } $this->cols = count($this->arr['width']); }//end func _max_cells_width } //end of class array_to_image ?>