не удается получить base64 изображения, созданного с использованием PHP, с использованием fopen и file_get_contents?

Итак, я хочу, чтобы пользователь мог загрузить изображение, PHP-скрипт добавит к нему водяной знак, а изображение будет размещено на imgur с использованием imgur API.

Добавление водяного знака к изображению и размещение его в imgur не проблема, но проблема в том, что для загрузки изображения в imgur мы должны передать base64 изображения, и я не могу получить изображение, которому PHP присвоил водяной знак скрипт с использованием file_get_contents и fopen всегда выдает ошибку

Кто-нибудь, пожалуйста, помогите мне с проблемой, чтобы я мог получить изображение, закодировать его в base64.

Это все

ОБНОВИТЬ:

Просто чтобы сказать вам, я использовал функцию, чтобы открыть файл PHP НЕПОСРЕДСТВЕННО без предварительного сохранения изображения на диск, по какой-то причине я не могу сохранить изображение на диск, поэтому я использую imgur

ОБНОВЛЕНИЕ СНОВА:

вот мой код:

<?php
    header('Content-type: image/png');
    $image = $_GET['url'];
    $imagesize = getimagesize($image);
    $img = imagecreatetruecolor($imagesize[0], $imagesize[1] + 50);
    imagecopy($img, imagecreatefrompng($image), 0, 0, 0, 0, $imagesize[0], $imagesize[1]);
    $string = "Some wild watermarks";
    $font = "font.ttf";
    $fontSize="30";
    $textColor = imagecolorallocate($img, 255,255,255);
    $x=7;
    $y=$imagesize[1] + 42;
    imagettftext($img,$fontSize,0,$x,$y,$textColor,$font,$string);
    imagepng($img);
?>

Вот ошибка, которую я получил:

Использование file_get_contents:

Warning: file_get_contents(watermark.php?url=roughdesign.png) [function.file-get-contents]: failed to open stream: Result too large in URL

Использование fopen:

Warning: fopen(watermark.php?url=roughdesign.png) [function.fopen]: failed to open stream: Result too large in URL
Warning: filesize() [function.filesize]: stat failed for URL
Warning: fread(): supplied argument is not a valid stream resource in URL

person gamehelp16    schedule 27.03.2013    source источник
comment
Опубликуйте свой код, пожалуйста.   -  person cryptic ツ    schedule 27.03.2013
comment
всегда выдает ошибку, это не правильное описание вашей проблемы. Объясните и покажите, что вы пробовали, какие ошибки произошли и что вы ожидаете.   -  person Repox    schedule 27.03.2013
comment
@cryptic: позже, когда я доберусь до своего компьютера   -  person gamehelp16    schedule 27.03.2013
comment
Тема не имеет никакого отношения к вашей проблеме. Вы должны пересмотреть это. Поскольку, читая его, предполагается, что у вас есть проблемы с созданием водяных знаков и загрузкой изображений (я думаю, это два отдельных вопроса), но затем вы заявляете, что это не проблема. Кроме того, он всегда выдает ошибку недостаточно информативно. Может быть все, от заблокированного файла до ошибки, прежде чем даже записать файл или попытаться открыть неправильный путь. quality.mozilla.org/docs /bugzilla/стартовый набор/   -  person inquam    schedule 27.03.2013
comment
@repox: я точно забыл, что говорит ошибка, но там написано что-то вроде того, что изображение превысило максимальный размер файла, если я не ошибаюсь. Интересно, почему появляется ошибка, ведь картинка не большая   -  person gamehelp16    schedule 27.03.2013
comment
@inquam: заголовок отредактирован :D   -  person gamehelp16    schedule 27.03.2013
comment
Как получить файл и добавить к нему водяной знак? Он открывается с помощью fopen? В таком случае вы его закроете? Вы сохраняете новый файл с тем же именем по тому же пути? Какой файл и когда вы открываете и вычисляете base64?   -  person inquam    schedule 27.03.2013
comment
Отредактировано: вот мой код и ошибка, которую я получил   -  person gamehelp16    schedule 27.03.2013


Ответы (2)


Вы можете попробовать это-

<?php
function base64_encode_image ($filename=string,$filetype=string) {
    if ($filename) {
        $imgbinary = fread(fopen($filename, "r"), filesize($filename));
        return 'data:image/' . $filetype . ';base64,' . base64_encode($imgbinary);
    }
}
?>

Дополнительную информацию можно найти на странице base64_encode.

OR

В качестве альтернативы вы можете сделать это-

$imageContent= file_get_contents($yourImage);
$encoded = base64_encode($imageContent);
person Suresh Kamrushi    schedule 27.03.2013
comment
Я думаю, что его проблема как-то связана с открытием файла, добавлением водяного знака и невозможностью после этого получить base64. Он должен добавить водяной знак, сохранить новое изображение, а затем открыть его и вычислить base64 этого изображения. Прямо сейчас мы не знаем, сохраняет ли он изображение в ящике и когда, и на каком изображении или данных он пытается вычислить base64. - person inquam; 27.03.2013
comment
@inquam: Итак, изображение, которое я не могу вычислить в base64, является изображением, созданным PHP-скриптом - person gamehelp16; 27.03.2013
comment
@gamehelp16: Вы добавляете водяной знак и сохраняете файл, а затем пытаетесь открыть этот файл с помощью file_get_contents? Что говорится в сообщении об ошибке? - person inquam; 27.03.2013
comment
нет, я использую file_get_contents, чтобы напрямую открыть файл PHP - person gamehelp16; 27.03.2013
comment
@gamehelp16: PHP-файл? Какой файл PHP? Разве вы только что не добавляли водяные знаки к изображениям? :) - person inquam; 27.03.2013
comment
Я использую PHP-скрипт для создания водяных знаков, так что это примерно так: watermark.php?img=IMAGE_URL - person gamehelp16; 27.03.2013

Простая идея псевдокода

  • Откройте изображение и добавьте водяной знак в соответствии с http://php.net/manual/en/image.examples-watermark.php
  • Сохраните только что созданное изображение (содержащее водяной знак) на диск.
  • Вычислить base64 вновь созданного файла

Это должно работать нормально. Если вы получаете какие-либо ошибки, укажите, что они говорят и где вы их взяли.

person inquam    schedule 27.03.2013
comment
но это означает, что загружать изображение на imgur бесполезно, потому что по какой-то причине я не могу сохранить изображение на диск, поэтому я размещаю его на imgur - person gamehelp16; 27.03.2013
comment
@gamehelp16: Значит, вы хотите добавить водяной знак только к изображению в памяти, а затем загрузить его, не сохраняя? Это должно работать, просто рассчитайте base64 вновь созданного изображения, не сохраняя его. Если вам не разрешено сохранять изображение локально, я предполагаю, что файл, который вы получаете при попытке прочитать с помощью get_file_contents, должен быть исходным изображением? Если это так, у вас есть права на чтение этого файла? - person inquam; 27.03.2013
comment
извините, я не знаю о правах доступа к файлам для локального хоста, потому что я все еще тестирую код на локальном хосте - person gamehelp16; 27.03.2013