Помощник
Здравствуйте, гость ( Вход | Регистрация )
|
|
16:07:2007, 13:18
|
|
Новенький ![]() Группа: Программист Сообщений: 9 Регистрация: 16:07:2007 Из: Санкт-Петербург Пользователь №: 11 855 Специализация: студент факультета технической кибернетики Репутация: 0
|
Задача вроде несложная, но решить не получается...
На сайте http://www-128.ibm.com/ … bmp/?dwzone=wireless можно подсмотреть формат файла. Как "вручную", т.е. без использования конвертеров, написать такую картинку? хотя бы ту, что описана в примере... так как нужно не перевести формат уже известной картинки, а нарисовать её из данных, полученных также в виде двоичного файла (с предварительным преобразованием). Есть вариант подключения библиотеки GD, но этот вариант менее предпочтителен, тем более что попытки подключения не увенчались успехом((( P.S. Работаю под Windows |
|
Сообщение
#1
|
|
![]() |
|
|
16:07:2007, 22:11
|
|
Продвинутый ![]() ![]() Группа: Программист Сообщений: 198 Регистрация: 4:08:2006 Из: Vladivostok.pm Пользователь №: 5 749 Специализация: Perl, Web Репутация: 4
|
Для: Катенька
Ура! Девушка на нашем празднике жизни! Установка 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 |
|
Сообщение
#2
|
|
|
|
17:07:2007, 10:34
|
|
Новенький ![]() Группа: Программист Сообщений: 9 Регистрация: 16:07:2007 Из: Санкт-Петербург Пользователь №: 11 855 Специализация: студент факультета технической кибернетики Репутация: 0
|
во-первых, большое спасибо за ответ!
Стоит VisualStudio.net, точнее на другом компутере, но можно поставить на этот без проблем. Пробовала и через CPAN, и вручную через makefile, но всё как-то не шло, я вообще в этой области ПОЛНЫЙ новичок, поэтому действовала по инструкциям, найденным в интернете... сейчас попробую по Вашему руководству, надеюсь, что получится. Но ещё больше хотелось бы узнать как сделать картинку из 0 и 1... потому что этот метод более предпочтителен... если это вообще возможно. Скопировать байты заголовка и информационные из сконвертированного в wbmp файла в новый можно, но это получается как-то нехорошо, надо всегда иметь такой файл со всем набором байтов от 00000000 до 11111111 P.S. Vovochka, жаль что Вы из Владивостока, а так бы я с удовольствием пригласила на чай))) |
|
Сообщение
#3
|
|
|
|
17:07:2007, 22:16
|
|
Продвинутый ![]() ![]() Группа: Программист Сообщений: 198 Регистрация: 4:08:2006 Из: Vladivostok.pm Пользователь №: 5 749 Специализация: Perl, Web Репутация: 4
|
На самом деле собирать в ручную - способ не очень приятный, но знать его стоит
Я так и апач собирал и модули к нему... Знать стоит. А модули к перлу стоит ставить через ppm, а не через cpan. Так как cpan ориентируеться на makefile, и опять таки, если при сборке требуеться скомпилировать библиотеку, ничего не выйде. ImageMagick - настоятельно рекомендую, мне нравиться больше, чем GD. Если не поможет для ваших целей, чтож, придеться вам побитно файл писать P.S. Чай люблю Сообщение отредактировал Vovochka - 17:07:2007, 22:17 |
|
Сообщение
#4
|
|
|
|
18:07:2007, 09:13
|
|
Новенький ![]() Группа: Программист Сообщений: 9 Регистрация: 16:07:2007 Из: Санкт-Петербург Пользователь №: 11 855 Специализация: студент факультета технической кибернетики Репутация: 0
|
Ну вот, вышел тормоз со студией, кто-то украл диск) а вот с 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 также в отдельных папках, может, надо модуль куда-то так выложить? какие файлы? я не знаю что такое репозитории Кстати, чем модуль ImageMagic лучше GD в плане рисования? Думаю, для меня будет достаточно GD... мне нужно получить монохромное предельно простое изображение... И ещё раз... всё-таки, значит, побитно можно написать? только как??? если это не очень сложно, подскажите, как? а то когда я просто записываю в файл тупо 0-ки и 1-ки согласно формату, картинка не отображается P.S. Вы мозг... апач я вообще боюсь... а мне ещё предстоит... А ещё мы живём а разное время... а я-то думаю, что человеку ночью не спится Сообщение отредактировал Катенька - 18:07:2007, 09:21 |
|
Сообщение
#5
|
|
|
|
18:07:2007, 11:07
|
|
Новенький ![]() Группа: Программист Сообщений: 9 Регистрация: 16:07:2007 Из: Санкт-Петербург Пользователь №: 11 855 Специализация: студент факультета технической кибернетики Репутация: 0
|
И ещё: попробовала через Студию. Распаковала GD уже чуть ли не во все папки
Вот что вышло: 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. А библиотеку и модуль я уже тоже везде распихала, так что я не знаю почему он не может найти этот файл... вообще-то его и нет А на том компе где Студия, ppm вообще просто так нет, есть ppm-shell какой-то, я попробовала через него, он говорит то же cамое (Can't locate... ) но только про файл strict.pm ... at ppm-shell line 3. |
|
Сообщение
#6
|
|
|
|
18:07:2007, 22:23
|
|
Новенький ![]() Группа: Программист Сообщений: 9 Регистрация: 16:07:2007 Из: Санкт-Петербург Пользователь №: 11 855 Специализация: студент факультета технической кибернетики Репутация: 0
|
ну вот, всё нет ответа... спать...
|
|
Сообщение
#7
|
|
|
|
18:07:2007, 23:01
|
|
Продвинутый ![]() ![]() Группа: Программист Сообщений: 198 Регистрация: 4:08:2006 Из: Vladivostok.pm Пользователь №: 5 749 Специализация: Perl, Web Репутация: 4
|
Катенька У меня есть 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, если я не ошибаюсь. Трудно будет разве что с заголовком. Хотя и там можно что-то придумать. Сообщение отредактировал Vovochka - 19:07:2007, 05:57 |
|
Сообщение
#8
|
|
|
|
19:07:2007, 07:17
|
|
Новенький ![]() Группа: Программист Сообщений: 9 Регистрация: 16:07:2007 Из: Санкт-Петербург Пользователь №: 11 855 Специализация: студент факультета технической кибернетики Репутация: 0
|
Спасибо огромное!
Да, про пиксели я конечно понимаю. Вот только снова не получается получить картинку... При записи в файл, а делаю я это таким образом, используя Ваш код: Код 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 используется только для чтения из файла, да и разницы при его включении нет. |
|
Сообщение
#9
|
|
|
|
19:07:2007, 07:21
|
|
Продвинутый ![]() ![]() Группа: Программист Сообщений: 198 Регистрация: 4:08:2006 Из: Vladivostok.pm Пользователь №: 5 749 Специализация: Perl, Web Репутация: 4
|
Код print FILEOUT 0b00000000; Круто... Я и забыл, что так можно, точнее просто не привык А заговок bmp файла вы как пишете? В вашем листинге этого нет. |
|
Сообщение
#10
|
|
|
|
19:07:2007, 07:24
|
|
Новенький ![]() Группа: Программист Сообщений: 9 Регистрация: 16:07:2007 Из: Санкт-Петербург Пользователь №: 11 855 Специализация: студент факультета технической кибернетики Репутация: 0
|
там ссылка на формат есть, заголовок - это два нулевых байта
http://www-128.ibm.com/developerworks/libr...dwzone=wireless Сообщение отредактировал Катенька - 19:07:2007, 07:25 |
|
Сообщение
#11
|
|
|
|
19:07:2007, 07:30
|
|
Продвинутый ![]() ![]() Группа: Программист Сообщений: 198 Регистрация: 4:08:2006 Из: Vladivostok.pm Пользователь №: 5 749 Специализация: Perl, Web Репутация: 4
|
+ еще 2 байта на длину и щирину.
Ладно, позже выложу рабочий код, ай да кто быстрее У вас весь день впереди, а у меня уже вечер. |
|
Сообщение
#12
|
|
|
|
19:07:2007, 07:33
|
|
Новенький ![]() Группа: Программист Сообщений: 9 Регистрация: 16:07:2007 Из: Санкт-Петербург Пользователь №: 11 855 Специализация: студент факультета технической кибернетики Репутация: 0
|
только я вряд ли смогу выложить рабочий, я это давно пытыюсь сделать))) А сколько сейчас? почти 2 часа ночи??? нее, 6 часов
Сообщение отредактировал Катенька - 19:07:2007, 07:40 |
|
Сообщение
#13
|
|
|
|
19:07:2007, 23:01
|
|
Продвинутый ![]() ![]() Группа: Программист Сообщений: 198 Регистрация: 4:08:2006 Из: Vladivostok.pm Пользователь №: 5 749 Специализация: Perl, Web Репутация: 4
|
Код 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 - то что поможет для решения этой проблемы. |
|
Сообщение
#14
|
|
|
|
20:07:2007, 06:40
|
|
Новенький ![]() Группа: Программист Сообщений: 9 Регистрация: 16:07:2007 Из: Санкт-Петербург Пользователь №: 11 855 Специализация: студент факультета технической кибернетики Репутация: 0
|
ААААА!!! ВЫ ГЕНИЙ!!!!!!
Ну, и напоследок, маленький вопросик по коду |
|
Сообщение
#15
|
|
![]() |
|
Текстовая версия | Сейчас: 17:05:2008 - 04:46 |