Версия для печати темы

Нажмите сюда для просмотра этой темы в обычном формате

Форум программистов _ Perl программирование _ Получение Wbmp-картинки на Perl

Автор: Катенька 16:07:2007, 13:18

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

Автор: Vovochka 16:07:2007, 22:11

Для: Катенька
Ура! Девушка на нашем празднике жизни! laugh.gif
Установка 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
и все будет wink.gif Хотя могут быть проблемы с репозиториями.

Я же посоветую вам еще обратить внимание на модуль ImageMagick wink.gif Удачи. cool.gif

Автор: Катенька 17:07:2007, 10:34

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

Автор: Vovochka 17:07:2007, 22:16

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

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

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

Автор: Катенька 18:07:2007, 09:13

Ну вот, вышел тормоз со студией, кто-то украл диск) а вот с 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 также в отдельных папках, может, надо модуль куда-то так выложить? какие файлы?
я не знаю что такое репозитории biggrin.gif
Кстати, чем модуль ImageMagic лучше GD в плане рисования? Думаю, для меня будет достаточно GD... мне нужно получить монохромное предельно простое изображение...
И ещё раз... всё-таки, значит, побитно можно написать? только как??? если это не очень сложно, подскажите, как? а то когда я просто записываю в файл тупо 0-ки и 1-ки согласно формату, картинка не отображается sad.gif Конечно, не хотелось бы наглеть, но... может, кусочек кода??? rolleyes.gif

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

Автор: Катенька 18:07:2007, 11:07

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

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.

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



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

Автор: Катенька 18:07:2007, 22:23

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

Автор: Vovochka 18:07:2007, 23:01

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

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

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

Вы должны прекрасно понимать, что у монохромного bmp карта цветов кодируеться не байтами, а битами.
посему 1 байт закодирует вам 8 пикселей.

Код
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, если я не ошибаюсь.


Трудно будет разве что с заголовком. Хотя и там можно что-то придумать.

Автор: Катенька 19:07:2007, 07:17

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

Код
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;


получается то же, что и при такой записи:

Код
print FILEOUT 0b00000000;
print FILEOUT 0b00000000;
print FILEOUT 0b00000011;
print FILEOUT 0b00000011;
print FILEOUT 0b01000000;
print FILEOUT 0b10100000;
print FILEOUT 0b01000000;


Потом открываю полученный файл с помошью Opera... он понимает, что это рисунок, но какой - нет, пишет просто в квадратике "Рисунок" и всё... Может, я неправильно в файл пишу??? binmode используется только для чтения из файла, да и разницы при его включении нет.

Автор: Vovochka 19:07:2007, 07:21

Код
print FILEOUT 0b00000000;


Круто... Я и забыл, что так можно, точнее просто не привык smile.gif

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

Автор: Катенька 19:07:2007, 07:24

там ссылка на формат есть, заголовок - это два нулевых байта

http://www-128.ibm.com/developerworks/libr...dwzone=wireless

Автор: Vovochka 19:07:2007, 07:30

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

Автор: Катенька 19:07:2007, 07:33

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

Автор: Vovochka 19:07:2007, 23:01

Код
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 - то что поможет для решения этой проблемы. wink.gif

Автор: Катенька 20:07:2007, 06:40

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

Русская версия Invision Power Board (http://www.nulled.ws)
© Invision Power Services (http://www.nulled.ws)