Получение Wbmp-картинки на Perl

Тема в разделе "Perl программирование", создана пользователем -, 16 июл 2007.

Статус темы:
Закрыта.
  1. Гость

    Задача вроде несложная, но решить не получается...
    На сайте http://www-128.ibm.com/ … bmp/?dwzone=wireless можно подсмотреть формат файла. Как "вручную", т.е. без использования конвертеров, написать такую картинку? хотя бы ту, что описана в примере... так как нужно не перевести формат уже известной картинки, а нарисовать её из данных, полученных также в виде двоичного файла (с предварительным преобразованием).
    Есть вариант подключения библиотеки GD, но этот вариант менее предпочтителен, тем более что попытки подключения не увенчались успехом(((
    P.S. Работаю под Windows :)
     
  2. Vovochka

    Vovochka Гость

    Для: Катенька
    Ура! Девушка на нашем празднике жизни! :)
    Установка GD не прошла успешно скорее всего, потому что вы просто скачали пакет и пытались ставить его через makefile.pm. Чтож, если у вас на компе не стоить C++ компилятора, то тогда у вас действительно ничего не выйдет, есди же стоит...
    То на примере Visual Studio я объясню как это дело поставить.
    И так, все делаем через консоль. Идем по адресу %VS_Path%/Common7/tools/
    Там запускаем vsvars32.bat. Этот скрипт добавит пути к компилятору, библиотекам, заголовочным файлам..
    Теперь идем в пупку с расспоковынным GD и пробуем
    perl makefile.pl
    nmake
    nmake install

    Если что-то не выйдет, то надо ручками ковыряться в makefile'е

    Есть более демакратичный метод. А именно ppm.
    Именно через него ставятьчся любые пакеты без всяких проблем, программа сама отслеживает все зависимости. Так что набирайте в cmd: ppm install GD
    и все будет ;) Хотя могут быть проблемы с репозиториями.

    Я же посоветую вам еще обратить внимание на модуль ImageMagick ;) Удачи. ;)
     
  3. Гость

    во-первых, большое спасибо за ответ!
    Стоит VisualStudio.net, точнее на другом компутере, но можно поставить на этот без проблем. Пробовала и через CPAN, и вручную через makefile, но всё как-то не шло, я вообще в этой области ПОЛНЫЙ новичок, поэтому действовала по инструкциям, найденным в интернете... сейчас попробую по Вашему руководству, надеюсь, что получится.
    Но ещё больше хотелось бы узнать как сделать картинку из 0 и 1... потому что этот метод более предпочтителен... если это вообще возможно. Скопировать байты заголовка и информационные из сконвертированного в wbmp файла в новый можно, но это получается как-то нехорошо, надо всегда иметь такой файл со всем набором байтов от 00000000 до 11111111 :( то есть сначала написовать его в paint и всегда с собой "носить"... я наверное, непонятно объясняю :)
    P.S. Vovochka, жаль что Вы из Владивостока, а так бы я с удовольствием пригласила на чай)))
     
  4. Vovochka

    Vovochka Гость

    На самом деле собирать в ручную - способ не очень приятный, но знать его стоит :angry:
    Я так и апач собирал и модули к нему... Знать стоит.

    А модули к перлу стоит ставить через ppm, а не через cpan. Так как cpan ориентируеться на makefile, и опять таки, если при сборке требуеться скомпилировать библиотеку, ничего не выйде.
    ImageMagick - настоятельно рекомендую, мне нравиться больше, чем GD. Если не поможет для ваших целей, чтож, придеться вам побитно файл писать :) Не скажу, что перл для этого удобен.

    P.S. Чай люблю ;) И симпатичных девушек тоже (надежда умерает последней) ;)
     
  5. Гость

    Ну вот, вышел тормоз со студией, кто-то украл диск) а вот с ppm говорит вот что:

    DBI connect<'dbname=C:\Documents and Settings\ pЭ \Application Data/ActiveState/ActivePerl/819/ppm-MSWin32-x86-multi-thread-5_8.db','',...>
    failed: unable to open database file<1>

    что я неправильно делаю? модуль и сама библиотека в папке Perl также в отдельных папках, может, надо модуль куда-то так выложить? какие файлы?
    я не знаю что такое репозитории :D
    Кстати, чем модуль ImageMagic лучше GD в плане рисования? Думаю, для меня будет достаточно GD... мне нужно получить монохромное предельно простое изображение...
    И ещё раз... всё-таки, значит, побитно можно написать? только как??? если это не очень сложно, подскажите, как? а то когда я просто записываю в файл тупо 0-ки и 1-ки согласно формату, картинка не отображается :( Конечно, не хотелось бы наглеть, но... может, кусочек кода??? :)

    P.S. Вы мозг... апач я вообще боюсь... а мне ещё предстоит...
    А ещё мы живём а разное время... а я-то думаю, что человеку ночью не спится :D
     
  6. Гость

    И ещё: попробовала через Студию. Распаковала GD уже чуть ли не во все папки :D
    Вот что вышло:

    C:\Program Files\Microsoft Visual Studio .NET 2003\Common7\Tools>vsvars32.bat
    Setting environment for using Microsoft Visual Studio .NET 2003 tools.
    <If you have another version of Visual Studio or Visual C++ installed and wish to
    use its tools from the command line, run vcvars32.bay for that version.>

    C:\Perl\bin\perl makefile.pl
    Can't locate ExtUtils/MakeMaker.pm in @INC <@INC contains: C:/Perl/site/lib C:/Perl/lib .> at makefile.pl line 1.
    BEGIN failed--compilation aborted at makefile.pl line 1.

    А библиотеку и модуль я уже тоже везде распихала, так что я не знаю почему он не может найти этот файл... вообще-то его и нет :) да, файла makeMaker.pm я нигде найти не могу :( ну всё, я не знаю что делать :D



    А на том компе где Студия, ppm вообще просто так нет, есть ppm-shell какой-то, я попробовала через него, он говорит то же cамое (Can't locate... ) но только про файл strict.pm ... at ppm-shell line 3. :(
     
  7. Гость

    ну вот, всё нет ответа... спать...
     
  8. Vovochka

    Vovochka Гость

    Катенька У меня есть ICQ и в профиле можно найти. Если я в сети, значит я в сети.
    (Не смотря на то, что вы тоже указали свой номерок, инфа по нему какая-то левая.)

    Что за урезанный перл у вас стоит? Никогда еще не видел таких проблем.
    Снесите его, зайдите на activestate.com и скачайте последний. Все там будет шоколадно.
    Правда ~17 мегабайт скачать... Хотя как я знаю, вам не должно быть проблемно.

    Код, косательно побайтовой записи:

    Вы должны прекрасно понимать, что у монохромного bmp карта цветов кодируеться не байтами, а битами.
    посему 1 байт закодирует вам 8 пикселей.
    Код (Text):
    sub degree2 { # будем 2 возводить в степень
    my ($deg) = shift;
    return 1 unless ($deg);
    my ($i, $var) = (1, 2);
    while ($i < $deg) {
    $var *= 2;
    $i++;
    }
    return $var;
    }

    sub str2byte {
    my $str = shift;
    my @bytes = split '', $str;
    my $byte = 0;
    for (my $i = 0; $i < 8; $i++) {
    $byte |= (pop @bytes) * degree2($i);
    }
    return $byte;
    }
    # Пример вызова
    $byte = str2byte('10000001');
    # Теперь $byte должен быть равен 129, если я не ошибаюсь.
    Трудно будет разве что с заголовком. Хотя и там можно что-то придумать.
     
  9. Гость

    Спасибо огромное!
    Да, про пиксели я конечно понимаю. Вот только снова не получается получить картинку... При записи в файл, а делаю я это таким образом, используя Ваш код:

    Код (Text):
    open FILEOUT, ">D:/pic.WBMP" or die "îøèáêà ÷òåíèÿ ôàéëà: $!";
    #binmode FILEOUT;
    $byte = str2byte('00000000');
    print FILEOUT $byte;
    print FILEOUT $byte;
    $byte = str2byte('00000011');
    print FILEOUT $byte;
    print FILEOUT $byte;
    $byte = str2byte('01000000');
    print FILEOUT $byte;
    $byte = str2byte('10100000');
    print FILEOUT $byte;
    $byte = str2byte('01000000');
    close FILEOUT;
    получается то же, что и при такой записи:

    Код (Text):
    print FILEOUT 0b00000000;
    print FILEOUT 0b00000000;
    print FILEOUT 0b00000011;
    print FILEOUT 0b00000011;
    print FILEOUT 0b01000000;
    print FILEOUT 0b10100000;
    print FILEOUT 0b01000000;
    Потом открываю полученный файл с помошью Opera... он понимает, что это рисунок, но какой - нет, пишет просто в квадратике "Рисунок" и всё... Может, я неправильно в файл пишу??? binmode используется только для чтения из файла, да и разницы при его включении нет.
     
  10. Vovochka

    Vovochka Гость

    Код (Text):
    print FILEOUT 0b00000000;
    Круто... Я и забыл, что так можно, точнее просто не привык :)

    А заговок bmp файла вы как пишете?
    В вашем листинге этого нет.
     
  11. Гость

  12. Vovochka

    Vovochka Гость

    + еще 2 байта на длину и щирину.
    Ладно, позже выложу рабочий код, ай да кто быстрее :)
    У вас весь день впереди, а у меня уже вечер.
     
  13. Гость

    только я вряд ли смогу выложить рабочий, я это давно пытыюсь сделать))) А сколько сейчас? почти 2 часа ночи??? нее, 6 часов :) я только проснулась :D но, как и всегда, буду пытаться что-то написать...
     
  14. Vovochka

    Vovochka Гость

    Код (Text):
    open FILE, '>qwe.wbmp';
    binmode FILE, ':raw';
    syswrite FILE, chr 0b00000000;
    syswrite FILE, chr 0b00000000;
    syswrite FILE, chr 0b00000011;
    syswrite FILE, chr 0b00000011;
    syswrite FILE, chr 0b10100000;
    syswrite FILE, chr 0b01000000;
    syswrite FILE, chr 0b10100000;
    close FILE;
    Простой анализ файла показал, что туда пишеться не то, что предпологалось.
    chr - то что поможет для решения этой проблемы. B)
     
  15. Гость

    ААААА!!! ВЫ ГЕНИЙ!!!!!! :) Почему я не нашла этого сисврайта и чудесного chr??? Я счастлива!!! Конец мучениям!!! ОГРОМНОЕ СПАСИБО! Вы не представляете, что для меня сделали!!! Круто....
    Ну, и напоследок, маленький вопросик по коду B) Что это за атрибут для binmode - ' :raw'???
     
Загрузка...
Статус темы:
Закрыта.

Поделиться этой страницей