Библиотека PHP imagegrabwindow GD возвращает только черные изображения

Я надеюсь, что есть кто-то, кто может помочь мне и многим другим с этой проблемой...

Я хочу создать скриншот веб-сайта, используя часть функции imagegrabwindow php и библиотеку GD.

Потратив целый день на реализацию кода, я, наконец, могу захватить изображение и сохранить его в файл, но изображение черное, а не то, что я ожидал...

При дальнейшем расследовании я узнал, что одна из причин, по которой изображение черное, заключается в том, что apache не включен для взаимодействия с рабочим столом, и из-за этого создается черное изображение. Проблема в том, что я не использую Apache как сервер. запускаю IIS 6...

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

<?php
    $browser = new COM("InternetExplorer.Application");
    $handle = $browser->HWND;
    $browser->Visible = true;
    $browser->Fullscreen = true;
    $browser->Navigate("http://localhost/site/advertise/index.asp");

    /* Still working? */
    while ($browser->Busy) {
        com_message_pump(4000);
    }
    $im = imagegrabwindow($handle, 0);
    imagepng($im, "iesnap6.jpg");
    $browser->Quit();
    ?> 

Благодаря ответам ниже я изменил imagepng на imagejpeg, но все равно получаю черное изображение...

imagejpeg($im, "iesnap7.jpg");

Любая помощь приветствуется!

Спасибо

Я изменил код следующим образом: Social Addict по-прежнему не имеет успеха с изображением, отображаемым в черном цвете!

  <?php
 header('Content-type: image/jpeg');
$browser = new COM("InternetExplorer.Application");
$handle = $browser->HWND;
$browser->Visible = true;
$browser->Navigate("http://localhost/advertise/index.asp");

/* Still working? */
while ($browser->Busy) {
    com_message_pump(4000);
}
$im = imagegrabwindow($handle, 0);
$browser->Quit();
imagejpeg($im," file2.jpg");
imagedestroy($im);
?> 

Social Addict - я добавил заголовок - я также постоянно меняю имя file1.jpg, чтобы убедиться, что он не использует кэшированные изображения черного цвета ... все еще не повезло!


person Gerald Ferreira    schedule 08.10.2009    source источник
comment
тебе нужен png или jpg?   -  person Andrew    schedule 09.10.2009
comment
попробуйте установить информацию заголовка, как я показал в своем сообщении сейчас, и получите доступ к вашему файлу php напрямую через браузер и посмотрите, что произойдет.   -  person Andrew    schedule 09.10.2009
comment
не уверен, имеет ли это значение, но поместите строку заголовка непосредственно перед выводом изображения, т.е. imagejpeg()   -  person Andrew    schedule 09.10.2009
comment
возможно, с Vista вам нужно установить права exec для объекта InternetExplorer DCOM через dcomcnfg   -  person Andrew    schedule 09.10.2009
comment
figured-it-out.com/figured-out.php?sid= 24 ‹ сделал это все еще не повезло   -  person Gerald Ferreira    schedule 09.10.2009


Ответы (7)


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

Я думаю, что это может быть как-то связано с этой строкой

imagepng($im, "iesnap6.jpg");

Вы сохраняете его как png и называете его здесь как jpg.

Попробуйте следующее, поскольку вы заявили, что хотите jpeg

imagejpeg($im, "iesnap6.jpg"); 

вместо

Попробуйте установить тип заголовка перед вызовом imagejpeg:

header('Content-type: image/jpeg');

затем получить доступ к сценарию напрямую из браузера и посмотреть, работает ли это?

Также это еще одна известная проблема с PHP.NET.

Эта функция работала мучительно медленно, когда я тестировал ее на своей машине. Потребовалось около 2 или 3 секунд, чтобы вернуть изображение. Он также не работает, если служба Apache не имеет доступа к «Взаимодействию с рабочим столом».

person Andrew    schedule 08.10.2009
comment
Я изменил его на imagepng($im, iesnap6.pmh); также и получить такое же черное изображение - у меня не установлен Appache, только работающий с IIS в качестве моего веб-сервера - что заставляет меня думать, что я должен каким-то образом разрешить IIS взаимодействовать с рабочим столом - person Gerald Ferreira; 09.10.2009
comment
Я имею в виду imagepng($im, iesnap6.png); (Правописание) - person Gerald Ferreira; 09.10.2009
comment
перейдите в настройки iis и разрешите взаимодействие с рабочим столом. Но строка, которую вы только что написали, не соответствует тому, что я предложил... imagejpeg($im, file.jpg); - person Andrew; 09.10.2009
comment
Спасибо SocialAddict - изменил его на imagejpeg($im, file.jpg); (Все еще черное изображение) в настройках я не могу найти IIS в качестве службы и предполагаю, что это служба публикации в Интернете, и разрешено взаимодействовать с перезапуском рабочего стола и убедиться, что служба запущена, но все еще получаю черное изображение... - person Gerald Ferreira; 09.10.2009
comment
Вам нужно вызвать команду фиксации браузера перед вызовом imagejpeg() - или пример на php.net кажется: php.oregonstate.edu/manual/en/function.imagegrabwindow.php - person Andrew; 09.10.2009
comment
попробуйте установить тип заголовка, как указано выше - person Andrew; 09.10.2009

Разрешено ли службе публикации IIS и WWW взаимодействовать с рабочим столом?

Мой компьютер -> управление -> службы -> [IIS и WWWPub...] -> LoginTab -> Разрешить взаимодействие с рабочим столом

person jitter    schedule 08.10.2009
comment
Я использую Vista-->Службы->Служба публикации в Интернете->Вкладка входа->Разрешить взаимодействие с рабочим столом Предполагая, что это то же самое, что и [IIS и WWWPub...], не имеют [IIS и WWWPub.. .] перезапустил мою машину и проверил, перезапущена ли служба ... все еще получаю изображение Black - person Gerald Ferreira; 09.10.2009

у меня была та же проблема, попробуйте изменить цветовое разрешение на 32 бита и попробуйте еще раз.

person Jaas    schedule 26.12.2009
comment
Спасибо, что вернулись ко мне, Джасс. Одна из проблем заключается в том, что мой сервер поддерживает только 16-битную версию. - person Gerald Ferreira; 27.12.2009

У меня были проблемы с imagegrabwindow(). В конце концов, не найдя помощи в решении проблемы, я решил посмотреть, смогу ли я написать скрипт для существующего плагина захвата страницы или расширения. Я обнаружил, что Pearl Crescent Page Saver для Firefox можно запускать из командной строки.

http://pearlcrescent.com/products/pagesaver/doc/#commandline

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

person LetMyPeopleCode    schedule 26.09.2010

Я выяснил проблему некоторое время назад: основная проблема заключалась в том, что на моем выделенном сервере не была установлена ​​​​32-битная графическая карта. Это привело к тому, что изображения отображались черным...

Я обновил свое серверное оборудование и установил 32-битную видеокарту, и теперь она работает без проблем.

person Gerald Ferreira    schedule 27.09.2010

Я только что нашел ответ, который, вероятно, поможет больше всего. Взято из комментария на PHP.net: http://www.php.net/manual/en/function.imagegrabscreen.php

  1. Щелкните правой кнопкой мыши «[Мой] компьютер» на рабочем столе, выберите «Управление».
  2. В разделе «Службы и приложения» дважды щелкните Службы.
  3. Найдите службу Apache (возможно, IIS) и щелкните правой кнопкой мыши, выберите «Свойства».
  4. На вкладке «Вход» убедитесь, что включен параметр «Разрешить взаимодействие службы с рабочим столом».
  5. Нажмите «ОК», закройте и перезапустите Apache (или IIS).

Если у вас его нет, то Apache не может взаимодействовать с рабочим столом вашего компьютера и возвращает пустое изображение.

person Exit    schedule 21.10.2011

Буква «t» в «Content-Type» должна быть заглавной.

До:

header('Content-type: image/jpeg');

После:

header('Content-Type: image/jpeg');

У меня сейчас работает..

person Rahul Narayan    schedule 19.12.2013