Форум программистов CODEBY.NET Хостинг в Беларуси — Active Technologies

Разработка бизнес сайтов

Нужны клиенты? Тогда сюда быстрее...
X   Сообщение сайта
(Сообщение закроется через 2 секунды)

Здравствуйте, гость ( Вход | Регистрация )




> Получение Wbmp-картинки на Perl, как получить битовый файл в заданном (известном) формате?
Катенька
Вставить ник
сообщение 16:07:2007, 13:18
Цитата Ответить 


Новенький
*

Группа: Программист
Сообщений: 9
Регистрация: 16:07:2007
Из: Санкт-Петербург
Пользователь №: 11 855
Специализация: студент факультета технической кибернетики



Репутация: - 0 +


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


Продвинутый
**

Группа: Программист
Сообщений: 198
Регистрация: 4:08:2006
Из: Vladivostok.pm
Пользователь №: 5 749
Специализация: Perl, Web



Репутация: - 4 +


Для: Катенька
Ура! Девушка на нашем празднике жизни! 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
Подняться вверх 
 
Сообщение #2
Катенька
Вставить ник
сообщение 17:07:2007, 10:34
Цитата Ответить 


Новенький
*

Группа: Программист
Сообщений: 9
Регистрация: 16:07:2007
Из: Санкт-Петербург
Пользователь №: 11 855
Специализация: студент факультета технической кибернетики



Репутация: - 0 +


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


Продвинутый
**

Группа: Программист
Сообщений: 198
Регистрация: 4:08:2006
Из: Vladivostok.pm
Пользователь №: 5 749
Специализация: Perl, Web



Репутация: - 4 +


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

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

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

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

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

Сообщение отредактировал Катенька - 18:07:2007, 09:21
Подняться вверх 
 
Сообщение #5
Катенька
Вставить ник
сообщение 18:07:2007, 11:07
Цитата Ответить 


Новенький
*

Группа: Программист
Сообщений: 9
Регистрация: 16:07:2007
Из: Санкт-Петербург
Пользователь №: 11 855
Специализация: студент факультета технической кибернетики



Репутация: - 0 +


И ещё: попробовала через Студию. Распаковала 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
Подняться вверх 
 
Сообщение #6
Катенька
Вставить ник
сообщение 18:07:2007, 22:23
Цитата Ответить 


Новенький
*

Группа: Программист
Сообщений: 9
Регистрация: 16:07:2007
Из: Санкт-Петербург
Пользователь №: 11 855
Специализация: студент факультета технической кибернетики



Репутация: - 0 +


ну вот, всё нет ответа... спать...
Подняться вверх 
 
Сообщение #7
Vovochka
Вставить ник
сообщение 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
Vovochka
Вставить ник
сообщение 19:07:2007, 07:21
Цитата Ответить 


Продвинутый
**

Группа: Программист
Сообщений: 198
Регистрация: 4:08:2006
Из: Vladivostok.pm
Пользователь №: 5 749
Специализация: Perl, Web



Репутация: - 4 +


Код
print FILEOUT 0b00000000;


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

А заговок 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
Vovochka
Вставить ник
сообщение 19:07:2007, 07:30
Цитата Ответить 


Продвинутый
**

Группа: Программист
Сообщений: 198
Регистрация: 4:08:2006
Из: Vladivostok.pm
Пользователь №: 5 749
Специализация: Perl, Web



Репутация: - 4 +


+ еще 2 байта на длину и щирину.
Ладно, позже выложу рабочий код, ай да кто быстрее wink.gif
У вас весь день впереди, а у меня уже вечер.
Подняться вверх 
 
Сообщение #12
Катенька
Вставить ник
сообщение 19:07:2007, 07:33
Цитата Ответить 


Новенький
*

Группа: Программист
Сообщений: 9
Регистрация: 16:07:2007
Из: Санкт-Петербург
Пользователь №: 11 855
Специализация: студент факультета технической кибернетики



Репутация: - 0 +


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

Сообщение отредактировал Катенька - 19:07:2007, 07:40
Подняться вверх 
 
Сообщение #13
Vovochka
Вставить ник
сообщение 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 - то что поможет для решения этой проблемы. wink.gif
Подняться вверх 
 
Сообщение #14
Катенька
Вставить ник
сообщение 20:07:2007, 06:40
Цитата Ответить 


Новенький
*

Группа: Программист
Сообщений: 9
Регистрация: 16:07:2007
Из: Санкт-Петербург
Пользователь №: 11 855
Специализация: студент факультета технической кибернетики



Репутация: - 0 +


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


Быстрый ответ  Ответить  Новая тема 

> Быстрый ответ
Полужирный
Курсив
Подчеркнутый
Вставить изображение
Смайлики
Цитата
Код
 
 Отправлять уведомления об ответах на e-mail |  Включить смайлики |  Добавить подпись
   

 

RSS Текстовая версия Сейчас: 17:05:2008 - 04:46
с нами можно связаться по:
телефону: +375-(29)-632-60-67
e-mail:info@codeby.net
Приглашаем в Чехию: детский отдых в чехии, прага туры. Туроператор по Чехии - Отдыхай.; смета отделочные работы