Как собирать () изображение? - PullRequest
3 голосов
/ 15 июня 2010

Я ищу, чтобы собирать () изображение.

В настоящее время я использую следующее

$img = ImageCreateFromPng($img_path);
flock($img,LOCK_EX);

Кажется, что дескриптор файла библиотеки GD недопустим для flock. Как я могу получить доступ к изображению и скопировать файл?

Ответы [ 3 ]

1 голос
/ 15 июня 2010

$ img в вашем примере это не дескриптор файла, это дескриптор ресурса изображения GD в памяти.

Вы можете использовать imagecreatefromstring для загрузки изображения следующим образом:

$file=fopen($fileName,"r+b");
flock($file,LOCK_EX);
$imageBinary=stream_get_contents($file);
$img=imagecreatefromstring($imageBinary);
unset($imageBinary); // we don't need this anymore - it saves a lot of memory

Если вы хотите сохранить измененную версию изображения в открытом потоке, вы должны использовать выходную буферизацию :

ob_start();
imagepng($img);
$imageBinary=ob_get_clean();

ftruncate($file,0);
fseek($file,0);
fwrite($file,$imageBinary);
unset($imageBinary);
flock($file,LOCK_UN);
fclose($file);
1 голос
/ 15 июня 2010

Функция flock работает только для файловых дескрипторов (или потоковых упаковщиков , если они поддерживают блокировку). Итак, если вы хотите заблокировать изображение при чтении, вам нужно открыть его дважды:

$f = fopen($imgPath, 'r');
if (!$f) {
    //Handle error (file does not exist perhaps, or no permissions?)
}
if (flock($f, LOCK_EX)) {
    $img = imagecreatefrompng($imgPath);
    //...  Do your stuff here

    flock($f, LOCK_UN);
}
fclose($f);
0 голосов
/ 15 июня 2010

flock работает только с файловыми указателями, а ImageCreateFromPng работает только с именами файлов. Попробуйте сделать два разных звонка:

$fp = fopen($img_path, 'r');
flock($fp, LOCK_EX);
$img = ImageCreateFromPng($img_path);

flock является кооперативным, поэтому он работает, только если все его используют. Пока ImageCreateFromPng не использует flock, приведенный выше код должен работать.

...