Forum Webscript.Ru
Программирование => Perl => Тема начата: evgeny_s от 19 Июля 2002, 12:57:22
-
Если кто знает, как сделать так, чтобы скрипт перед отображением картинки *.jpg или *.gif определял ширину и высоту в пикселях у такой картинки (если картинка маленькая - отображать сбоку, если большого размера - то снизу)?
С уважением, Евгений
-
http://forums.webscript.ru/showthread.php?s=&threadid=6603&msgnum=9
-
В общем этот код у меня не работает. Есть какой - нибудь другой, или может кто-нить объяснит, куда надо имя файла *.jpg вставлять???
($width, $height) = &get_jpg_dimentions($jpeg_file);
sub get_jpg_dimentions {
my($file_name) = shift || die "Image file not specified";
my($buffer, $id, $length);
open(JPG_FILE, \'<\' . $file_name) || die "Couldn\'t open image: $!";
binmode JPG_FILE;
sysread(JPG_FILE, $buffer, 2);
unless ($buffer eq "\\xFF\\xD8") {
warn "Not a JPEG file";
return;
}
while(sysread(JPG_FILE, $buffer, 4) == 4) {
($id, $length) = unpack("nn", $buffer);
if (($id == 0xFFC2) || ($id == 0xFFC0)) {
sysread(JPG_FILE, $buffer, 5);
close(JPG_FILE);
return (unpack("cnn", $buffer))[2,1];
}
else {
sysread(JPG_FILE, $buffer, $length - 2);
}
}
close(JPG_FILE);
return;
}
-
Вся проблема в том, что в переменной $width ничего нет после выполнения кода. Чем отличается $jpeg_file от $file_name в этом коде? И как можно этот код написать без return и sub - чтоб сразу в $width и $height размеры выдавались?
С уважением, Евгений.
-
Вобщем так. Этот скрипт я кинул нафиг. Вот есть гораздо лучше.
open(IMG ,"images/001.jpg");
sub Read1IMG {
read (IMG, $b, 1);
return ord($b);
}
sub Read2IMG {
read (IMG, $msb, 1);
read (IMG, $lsb, 1);
return ( (ord($msb) << 8) | ord($lsb) );
}
local $stop = 0;
while (!$stop) {
$aMarker = Read1IMG();
while ($aMarker != 0xFF) { $aMarker = Read1IMG(); }
$aMarker = Read1IMG();
while ($aMarker == 0xFF) { $aMarker = Read1IMG(); }
### got next marker
if ( (($aMarker >= 0xC0) && ($aMarker <= 0xCF)) &&
($aMarker != 0xC4) && ($aMarker != 0xCC) ) {
Read2IMG();
Read1IMG();
$img_height = Read2IMG();
$img_width = Read2IMG();
$stop = 1;
$img_type = "jpg";
}
}
print "Content type = text/html\\n\\n"
print "Тип: $img_type, Высота: $img_height, Ширина: $img_width\\n";
-
В общем этот код у меня не работает.
Иди по ссылке (см. выше), читай внимательно. Все работает на 100%. Гарантирую!
-
Внимание!
В YA скрипте есть ошибка - исправив которую все работает исправно:
...
sysread(JPG_FILE, $buffer, 2);
unless ($buffer eq "xFFxD8") { - "\\xFF\\xD8" -кто ж так шестнацетиричные представляет?
warn "Not a JPEG file"; - я бы использовал die;
return;
}
А вот в скрипте
...
А вот в скрипте evgeny_s присутствуют аномалии(не люблю замкнутых цыклов). Делайте выводы, господа.
-
Image::Size
-
В догонку
evgeny_s, сорри - твой скрипт вполне работает, только добавь binmode(IMG);
-
Serchey
[OFF]Вернувшись из отпуска, хочу восстановить справедливость[/OFF]
С чего ты взял, что я ссылался на свой скрипт? Я всего лишь написал, что того примера вполне достаточно для решения данной задачи. А в моем скрипте такой строки нет вообще :)
-
Image::Size - это все, что нужно.
-
YA
Я за справедливость! :beer: