Ok I am going to put the entire class here for review... I am not the
original author, simply trying to get it to work because I think its pretty
neat: Here is the file, asciiartist.php:
If you scroll down the page I have commented where the error occurs using
***** ERRORS *****
<?php
/**
* ASCIIArtist - Class to convert Bitmap-Images into nice ASCII Texts in HTML
format
*
* Copyright 2001 by Sebastian R�bke ([EMAIL PROTECTED])
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2, or (at your option)
* any later version. This program is distributed in the hope that it will be
useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
* Credits: Florian Sch�fer, Maxi Kellner, Andrea Spacca
* Requirements: PHP with GD support for the desired image format
*
* @author Sebastian R�bke <[EMAIL PROTECTED]>
* @version 1.1 2001-12-31 18:41 CET
* @link http://www.sebastian-r.de/asciiart/index.php
* @access public
*/
class ASCIIArtist
{
/**
* The replace characters from dark to light used by render modes 0,1
* (current version can handle 9 variations)
*
* @var array
* @access public
*/
var $replace_characters = array (
1 => "W",
2 => "@",
3 => "#",
4 => "*",
5 => "+",
6 => ":",
7 => ".",
8 => "’",
9 => " "
);
/**
* Possible image types
*
* @var array
* @access public
*/
var $image_types = array (
1 => "GIF",
2 => "JPEG",
3 => "PNG"
);
/**
* Image file handler
*
* @var string
* @access public
*/
var $image = NULL;
/**
* Image file height
*
* @var integer
* @access public
*/
var $image_height = 0;
/**
* Image file height
*
* @var integer
* @access public
*/
var $image_width = 0;
/**
* Container for the rendered HTML/ASCII image
*
* @var string
* @access public
*/
var $image_html = NULL;
/**
* CSS for the HTML Image Output
*
* @var string
* @access public
*/
var $image_css = "
color : #000000;
background-color: #FFFFFF;
font-size : 8px;
font-family : \"Courier New\", Courier, mono;
line-height : 5px;
letter-spacing : -1px;
";
/**
* Formatting the HTML Image using CSS
*
* Tip: Use width-fixed fonts such as Courier only.
*
* @param string $css CSS Content
* @access public
* @see $image_css
*/
function setImageCSS ($css)
{
$this->image_css = $css;
}
/**
* Returns the hex string of a rgb array
*
* Example:
* $rbg = array("red" -> 255, "green" -> 255, "blue" -> 255);
* rgb2hex($rgb) will return "FFFFFF"
*
* @param array $rgb An array of red, green and blue values
* @return string The hex values as one string
* @access private
*/
function _rgb2hex($rgb)
{
return
sprintf("%02X%02X%02X",$rgb["red"],$rgb["green"],$rgb["blue"]);
} // end func rgb2hex
/**
* Renders the image into HTML
*
* The following modes are implemented:
* 1 = black/white using $replaceCharacters by brightness,
* 2 = colourized using $replaceCharacters by brightness,
* 3 = colourized using a fixed character definded by $fixedChar.
* A resolution of 1 means that every pixel is being replaced,
* whereas 5 for example means a scanned block of 5 pixel height and
width,
* resulting in less data to replace.
*
* @param integer $mode Current version can handle mode 1, 2 or
3
* @param integer $resolution Resolution for scanning the bitmap.
* @param string $fixed_char Needed for mode 3
* @param boolean $flip_h Flip output horizontally?
* @param boolean $flip_v Flip output vertically?
* @access public
* @see getHTMLImage(), $replace_characters
*/
function renderHTMLImage($mode = 1, $resolution = 2, $fixed_char = "@",
$flip_h = false, $flip_v = false)
{
// Minimum value for $resolution is 1
if ($resolution < 1) {
$resolution = 1;
}
// Different loops for flipping
// (btw.: Can someone give me a hint how to implement
// dynamic operators or the like to get rid of those endless cases?)
if (!$flip_h && !$flip_v) {
// Y-Axis
for ($y = 0; $y < $this->image_height; $y += $resolution)
{
// X-Axis
for ($x = 0; $x < $this->image_width; $x += $resolution)
{
$this->renderPixel($mode, $x, $y, $fixed_char);
}
$this->image_html .= "<br>\n";
}
}
else if ($flip_h && !$flip_v) {
// Y-Axis
for ($y = 0; $y < $this->image_height; $y += $resolution)
{
// X-Axis
for ($x = $this->image_width; $x > 0; $x -= $resolution)
{
$this->renderPixel($mode, $x, $y, $fixed_char);
}
$this->image_html .= "<br>\n";
}
}
else if (!$flip_h && $flip_v) {
// Y-Axis
for ($y = $this->image_height; $y > 0; $y -= $resolution)
{
// X-Axis
for ($x = 0; $x < $this->image_width; $x += $resolution)
{
$this->renderPixel($mode, $x, $y, $fixed_char);
}
$this->image_html .= "<br>\n";
}
}
else if ($flip_h && $flip_v) {
// Y-Axis
for ($y = $this->image_height; $y > 0; $y -= $resolution)
{
// X-Axis
for ($x = $this->image_width; $x > 0; $x -= $resolution)
{
$this->renderPixel($mode, $x, $y, $fixed_char);
}
$this->image_html .= "<br>\n";
}
}
} // end func renderHTMLImage
/**
* Renders the current pixel
*
* @param integer $mode Current version can handle mode 1, 2 or
3
* @param integer $x X Position of the image
* @param integer $y Y Position of the image
* @param string $fixed_char Needed for mode 3
* @access public
* @see renderHTMLImage(), $image_html
*/
function renderPixel($mode, $x, $y, $fixed_char)
{
// RGB Value of current pixel (Array)
$rgb = imagecolorsforindex($this->image, imagecolorat($this->image,
$x, $y));
// Replace by mode
switch ($mode) {
case 1:
// Rounded Brightness
$brightness = $rgb["red"] + $rgb["green"] + $rgb["blue"];
// Choose replacing character
$replace_character_id = round($brightness / 100) + 1;
$this->image_html .=
$this->replace_characters[$replace_character_id];
break;
case 2:
// Rounded Brightness
$brightness = $rgb["red"] + $rgb["green"] + $rgb["blue"];
// Choose replacing character
$replace_character_id = round($brightness / 100) + 1;
$this->image_html .= "<font
color=\"#".$this->_rgb2hex($rgb)."\">".$this->replace_characters[$replace_ch
aracter_id]."</font>";
break;
case 3:
$this->image_html .= "<font
color=\"#".$this->_rgb2hex($rgb)."\">".$fixed_char."</font>";
break;
}
} // end func renderPixel
/**
* Returns the rendered HTML image and CSS
*
* @return string The rendered HTML image and CSS
* @access public
*/
function getHTMLImage()
{
if ($this->image_html) {
return "<style type=\"text/css\">"
.".asciiimage{"
.$this->image_css
."}</style>"
."<span class=\"asciiimage\">"
.$this->image_html
."</span>";
} else {
return "getHTMLImage(): No content to return. Please be sure to
call renderHTMLImage() first.";
}
} // end func getHTMLImage
/**
* Loads the bitmap image and sets file handler, width and height
properties
*
* If filename begins with "http://" (not case sensitive), an HTTP 1.0
connection
* is opened to the specified server, the page is requested using the
HTTP GET method.
* If filename begins with "ftp://" (not case sensitive), an ftp
connection to the
* specified server is opened.
* If the server does not support passive mode ftp, this will fail.
* If filename is one of "php://stdin", "php://stdout", or
"php://stderr",
* the corresponding stdio stream will be opened.
* If filename begins with anything else, the file will be opened from
the filesystem.
*
* @param string $image Filename of the bitmap Image
* @access public
* @see $image, $image_height, $image_width
*/
function ASCIIArtist($image)
{
if ($input = @fopen($image, "rb")) {
$image_data = fread ($input, 2048576);
fclose($input);
$tmp_image = tmpfile();
$output = fopen($tmp_image, "wb"); // ***** ERRORS ***** this is where
it begins
fwrite($output, $image_data);
fclose($output);
} else {
exit("Cannot access ".$image." for reading. (Does not exist or
has wrong permissions)");
}
// Create Image from file by type, get and set size
list($width,$height,$type) = getimagesize($tmp_image);
switch ($type) {
case 1:
case 2:
case 3:
eval("
if (!\$this->image =
@imagecreatefrom".$this->image_types[$type]."(\"".$tmp_image."\"))
exit(\"This PHP version cannot create image from
".$this->image_types[$type]."\");
");
unlink($tmp_image);
$this->image_height = $height;
$this->image_width = $width;
break;
default:
exit("ASCIIArtist(): Cannot determine image type of
".$image.".");
}
} // end constructor
}
?>
I am not quite sure how I can resolve this as is... It is not that important
to get working but I think it would be neat to see and test out a bit. If
there is a way to do the same thing without using a temp file that might
work in my case.
Jas
"1lt John W. Holmes" <[EMAIL PROTECTED]> wrote in message
012d01c201d3$17a91780$2f7e3393@TB447CCO3">news:012d01c201d3$17a91780$2f7e3393@TB447CCO3...
> You're not even trying to open a file. You're trying to open a Resource,
> which makes me think that fopen() is being called twice or something. You
> obviously have something very wrong.
>
> Can you show the code around these lines where you're trying to open the
> file? All of the errors are because of the first one.
>
> ---John Holmes...
>
> > -----Original Message-----
> > From: Jas [mailto:[EMAIL PROTECTED]]
> > Sent: Wednesday, May 22, 2002 4:18 PM
> > To: [EMAIL PROTECTED]
> > Subject: [PHP] tmpfile() errors?
> >
> >
> > Here are the errors I am recieving:
> > Warning: fopen("Resource id #4","wb") - Permission denied in
> > /path/to/asciiartist.php on line 295
> >
> > Warning: Supplied argument is not a valid File-Handle resource in
> > /path/to/asciiartist.php on line 296
> >
> > Warning: Supplied argument is not a valid File-Handle resource in
> > /path/to/asciiartist.php on line 297
> >
> > Warning: getimagesize: Unable to open 'Resource id #4' for reading. in
> > /path/to/asciiartist.php on line 303
> > ASCIIArtist(): Cannot determine image type of shared/image02.jpg.
> >
> > I have checked the file permissions for the files and directory in
> question
> > and they are all set to read & write, so I know this is not the problem.
> > Here is the function that I am trying to get to work.
> >
> > function ASCIIArtist($image)
> > {
> > if ($input = @fopen($image, "rb")) {
> > $image_data = fread ($input, 2048576);
> > fclose($input);
> > $tmp_image = tmpfile();
> > $output = fopen($tmp_image, "wb");
> > fwrite($output, $image_data);
> > fclose($output);
> > } else {
> > exit("Cannot access ".$image." for reading. (Does not exist
or
> > has wrong permissions)");
> > }
> >
> > This code is from http://www.sebastian-r.de/. And everything works fine
> > until it hits this function. Could I get some enlightenment on why it
> cannot
> > create a temp file named $tmp_image? (ecspecially when the permissions
> for
> > the file are correct?) Thanks in advance,
> > Jas
> >
> >
> >
> > --
> > PHP General Mailing List (http://www.php.net/)
> > To unsubscribe, visit: http://www.php.net/unsub.php
> >
> >
> > --
> > PHP General Mailing List (http://www.php.net/)
> > To unsubscribe, visit: http://www.php.net/unsub.php
> >
>
--
PHP General Mailing List (http://www.php.net/)
To unsubscribe, visit: http://www.php.net/unsub.php