ミームジェネレーターを作成するために、PHP GD ライブラリを使用していくつかの画像を処理しています。どの言語でも、これまで画像処理を行ったことはありません。
まず、POST 経由でアップロードされた画像を取得し、設定した最大幅と高さのパラメーターに従って、GD でサイズを変更します。サイズ変更された画像はサーバーに保存され、キャプションの設定に使用されるフォームとともに、次のページでユーザーに表示されます。このフォームには、すべてのキャプション情報 (キャプション テキスト、フォント サイズ、各キャプションの xy 位置) が含まれています。
サーバーに戻り、キャプション フォームのデータを使用して、前の手順でサイズを変更したファイルから GD リソースを作成し、キャプションを追加します。
.gif および .jpg/.jpeg ファイルでは魅力的に機能しますが、PNG ファイルを使用すると失敗します。アップロードされたファイルのサイズを変更すると正しく保存されますが、2 番目のステップで、サイズ変更されたファイルを使用して GD リソースを作成しようとすると、次のエラーがスローされます: Message: imagecreatefrompng() [function.imagecreatefrompng]: './images/ tmp/Phineas_talks_to_Perry1.png' は有効な PNG ファイルではありません
初めてファイルを作成するプロセス(サイズ変更)に関連していると思います。ファイルが存在しないわけではなく、毎回再確認しています。そして、それを自分のコンピューターにダウンロードし直して、Picassa で開くと問題ありません。
私はApacheサーバー(Go Daddy共有ホスティング)でCodeIgniterの上に取り組んでいます。
クラスにラップされた、私が使用する 2 つの関数のコードを次に示します (コメントはスペイン語です。無視してかまいません)。
class Imageprocessing
{
public function __construct()
{
$this->ci =& get_instance();
$this->ci->load->helper('file');
}
public function resize( $path, $overwrite = false, $destination = null, $name = null )
{
$output = 0;
//Si están seteados los parámetros de ancho y altura máximos
if( isset( $this->max_W ) && isset( $this->max_H ) )
{
//Si la ubicación que recibimos es un archivo válido
if( is_file( $path ) )
{
//Si el archivo es de tipo imagen
if( $this->is_image( $path ) )
{
$pathinfo = pathinfo( $path );
$ext = $pathinfo['extension'];
$file = $pathinfo['filename'];
$dir = $pathinfo['dirname'] . '/';
//Creando el recurso de imagen GD, usando la función apropiada según el mime type
if( $ext == 'jpeg' || $ext == 'jpg' )
{
$src = imagecreatefromjpeg( $path );
}
elseif( $ext == 'png' )
{
$src = imagecreatefrompng( $path );
}
elseif( $ext == 'gif' )
{
$src = imagecreatefromgif( $path );
}
//determinando el ancho y alto actual de la imagen
$W = imageSX( $src );
$H = imageSY( $src );
//Si alguno de los dos parámetros excede el máximo permitido, calculamos las nuevas dimensiones de la imagen
if( $W > $this->max_W || $H > $this->max_H )
{
//Si la foto es más alta que ancha
if( $W < $H )
{
/*Redimensionamos la altura al máximo permitido
/*Calculamos la proporción en que varió la altura y disminuimos el ancho en esa misma proporción
*/
$new_H = $this->max_H;
$new_W = $W * ( $this->max_H / $H );
}
elseif( $W > $H )
{
/*Redimensionamos el ancho al máximo permitido
/*Calculamos la proporción en que varió el ancho y disminuimos la altura en esa misma proporción
*/
$new_W = $this->max_W;
$new_H = $H * ( $this->max_W / $W );
}
else
{
$new_W = $this->max_W;
$new_H = $this->max_W;
}
//determinando la carpeta de destino y el nombre del nuevo archivo
if( $overwrite )
{
$destination = $path;
}
else
{
if( ! isset( $destination ) || empty( $destination ) )
{
$destination = $dir;
}
//si $destination no es un directorio válido
elseif( ! is_dir( $destination ) )
{
$destination = $dir;
}
if( ! isset( $name ) || empty( $name ) )
{
$destination .= "{$file}_" . (int) $new_W . 'x' . (int) $new_H . ".{$ext}";
}
else
{
//filtrar para que sea un nombre de archivo válido
$destination .= filter_var( str_replace( ' ', '_', $name ), FILTER_SANITIZE_URL ) . ".{$ext}";
}
}
//creamos la nueva imagen, redimensionada
$dst = imagecreatetruecolor( $new_W, $new_H );
imagecopyresampled( $dst, $src, 0, 0, 0, 0, $new_W, $new_H, $W, $H );
//según el mime
if( $ext == 'jpg' || $ext = 'jpeg' )
{
$success = imagejpeg( $dst, $destination, 100 );
}
elseif( $ext == 'png' )
{
$success = imagepng( $dst, $destination );
}
elseif( $ext == 'gif' )
{
$success = imagegif( $dst, $destination );
}
if( $success )
{
$output = array( 'src' => $destination, 'width' => $new_W, 'height' => $new_H );
}
unset( $src, $dst );
}
else
{
$output = -1;
}
}
else
{
$error = 'Debes usar un archivo de imagen';
}
}
else
{
$error = 'Debes especificar una ubicación de archivo válida';
}
}
else
{
$error = 'Para usar la función ' . __METHOD__ . ' de la clase ' . __CLASS__ . ' se deben especificar los parámetros de ancho máximo permitido ( max_W ) y altura máxima permitida ( max_H )';
}
if( isset( $error ) && ! empty( $error ) )
{
trigger_error( $error, E_USER_WARNING );
}
return $output;
}
public function caption( $path, $captions, $overwrite = false, $destination = null, $name = null )
{
$output = false;
if( is_file( $path ) )
{
if( $this->is_image( $path ) )
{
if( is_array( $captions ) )
{
$pathinfo = pathinfo( $path );
$ext = $pathinfo['extension'];
$file = $pathinfo['filename'];
$dir = $pathinfo['dirname'] . '/';
//Creando el recurso de imagen GD, usando la función apropiada según el mime type
if( $ext == 'jpeg' || $ext == 'jpg' )
{
$src = imagecreatefromjpeg( $path );
}
elseif( $ext == 'png' )
{
$src = imagecreatefrompng( $path );
}
elseif( $ext == 'gif' )
{
$src = imagecreatefromgif( $path );
}
$color = imagecolorallocate( $src, 255, 255, 255 );
foreach( $captions as $caption )
{
imagefttext( $src, $caption['font-size'], 0, $caption['x'], $caption['y'] + $caption['font-size'], $color, './fonts/impact.ttf', $caption['text'] );
}
if( $overwrite )
{
$destination = $path;
}
else
{
if( ! isset( $destination ) || empty( $destination ) )
{
$destination = $dir;
}
elseif( ! is_dir( $destination ) )
{
$destination = $dir;
}
if( ! isset( $name ) || empty( $name ) )
{
$destination .= "{$file}_caption.{$ext}";
}
else
{
//filtrar para que sea un nombre de archivo válido
$destination .= filter_var( str_replace( ' ', '_', $name ), FILTER_SANITIZE_URL ) . ".{$ext}";
}
}
//según el mime
if( $ext == 'jpg' || $ext = 'jpeg' )
{
$success = imagejpeg( $src, $destination, 100 );
}
elseif( $ext == 'png' )
{
$success = imagepng( $src, $destination );
}
elseif( $ext == 'gif' )
{
$success = imagegif( $src, $destination );
}
if( $success )
{
$output = array( 'src' => $destination, 'width' => (int) imageSX( $src ), 'height' => (int) imageSY( $src ) );
}
unset( $src );
}
else
{
$error = 'Los captions deben ingresarse como un array';
}
}
else
{
$error = 'Se debe usar un archivo de imagen';
}
}
else
{
$error = 'Se debe usar un archivo válido';
}
if( isset( $error ) && ! empty( $error ) )
{
trigger_error( $error, E_USER_WARNING );
}
return $output;
}
}
これの何が問題なのか、何か考えはありますか?
編集:このアドレスでこれまでに行ったことを試すことができます。スペイン語を無視して、ファイルをアップロードして試してください。ありがとう!
スクリプトで画像のサイズを変更するには、640x480 より大きい必要があります。
http://unmillondemascotas.org/meme/
問題は間違いなくイメージ作成プロセスにあります。手動で画像をサーバーにアップロードし、キャプション処理をハードコーディングしたところ、成功し、新しい PNG ファイルが作成されました。次に、同じファイルにもう一度キャプションを付けようとしましたが、失敗しました。したがって、新しい PNG ファイルを作成するときに何か間違ったことをしているに違いありませんが、それが何であるかはわかりません。