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

  • Автор темы -
  • Дата начала
Статус
Закрыто для дальнейших ответов.

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

Vovochka

Гость
#2
Для: Катенька
Ура! Девушка на нашем празднике жизни! :)
Установка 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, жаль что Вы из Владивостока, а так бы я с удовольствием пригласила на чай)))
 
V

Vovochka

Гость
#4
На самом деле собирать в ручную - способ не очень приятный, но знать его стоит :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. :(
 
V

Vovochka

Гость
#8
Катенька У меня есть 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, если я не ошибаюсь.
Трудно будет разве что с заголовком. Хотя и там можно что-то придумать.
 

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

Код:
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 используется только для чтения из файла, да и разницы при его включении нет.
 
V

Vovochka

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

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

Vovochka

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

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

Vovochka

Гость
#14
Код:
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'???
 
Статус
Закрыто для дальнейших ответов.