Автор Тема: Как определить height и width у картинки для ее правильного отображения?  (Прочитано 4090 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн evgeny_s

  • Заглянувший
  • Новичок
  • *
  • Сообщений: 19
  • +0/-0
  • 0
    • Просмотр профиля
    • http://
Если кто знает, как сделать так, чтобы скрипт перед отображением картинки *.jpg или *.gif определял ширину и высоту в пикселях у такой картинки (если картинка маленькая - отображать сбоку, если большого размера - то снизу)?
   С уважением, Евгений

Оффлайн YA

  • Модератор
  • Глобальный модератор
  • Ветеран
  • *****
  • Сообщений: 597
  • +0/-0
  • 0
    • Просмотр профиля
    • http://
Литературный перевод с русского и английского на Perl. Дорого!

Оффлайн evgeny_s

  • Заглянувший
  • Новичок
  • *
  • Сообщений: 19
  • +0/-0
  • 0
    • Просмотр профиля
    • http://
В общем этот код у меня не работает. Есть какой - нибудь другой, или может кто-нить объяснит, куда надо имя файла *.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;

Оффлайн evgeny_s

  • Заглянувший
  • Новичок
  • *
  • Сообщений: 19
  • +0/-0
  • 0
    • Просмотр профиля
    • http://
Вся проблема в том, что в переменной $width  ничего нет после выполнения кода. Чем отличается $jpeg_file от $file_name в этом коде? И как можно этот код написать без return и sub - чтоб сразу в $width и $height размеры выдавались?
С уважением, Евгений.

Оффлайн evgeny_s

  • Заглянувший
  • Новичок
  • *
  • Сообщений: 19
  • +0/-0
  • 0
    • Просмотр профиля
    • http://
Вобщем так. Этот скрипт я кинул нафиг. Вот есть гораздо лучше.


open
(IMG ,"images/001.jpg");
sub Read1IMG {
  
read (IMG$b1);
  return 
ord($b);
}
sub Read2IMG {
  
read (IMG$msb1);
  
read (IMG$lsb1);
	
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";

Оффлайн YA

  • Модератор
  • Глобальный модератор
  • Ветеран
  • *****
  • Сообщений: 597
  • +0/-0
  • 0
    • Просмотр профиля
    • http://
Цитировать
В общем этот код у меня не работает.

Иди по ссылке (см. выше), читай внимательно. Все работает на 100%. Гарантирую!
Литературный перевод с русского и английского на Perl. Дорого!

Оффлайн Serchey

  • Фанат форума
  • Постоялец
  • ***
  • Сообщений: 216
  • +0/-0
  • 0
    • Просмотр профиля
    • http://www.rivne.ukrtelecom.ua
Внимание!
В YA скрипте есть ошибка - исправив которую все работает исправно:
...
sysread(JPG_FILE, $buffer, 2);
unless ($buffer eq "xFFxD8") { - "\\xFF\\xD8" -кто ж так шестнацетиричные представляет?
warn "Not a JPEG file"; - я бы использовал die;
return;
}

А вот в скрипте
...

А вот в скрипте evgeny_s присутствуют аномалии(не люблю замкнутых цыклов). Делайте выводы, господа.

КшЫуфксрук

  • Гость

Оффлайн Serchey

  • Фанат форума
  • Постоялец
  • ***
  • Сообщений: 216
  • +0/-0
  • 0
    • Просмотр профиля
    • http://www.rivne.ukrtelecom.ua
В догонку
evgeny_s, сорри - твой скрипт вполне работает, только добавь binmode(IMG);

Оффлайн YA

  • Модератор
  • Глобальный модератор
  • Ветеран
  • *****
  • Сообщений: 597
  • +0/-0
  • 0
    • Просмотр профиля
    • http://
Serchey
[OFF]Вернувшись из отпуска, хочу восстановить справедливость[/OFF]
С чего ты взял, что я ссылался на свой скрипт? Я всего лишь написал, что того примера вполне достаточно для решения данной задачи. А в моем скрипте такой строки нет вообще :)
Литературный перевод с русского и английского на Perl. Дорого!

Оффлайн Vovan

  • Фанат форума
  • Постоялец
  • ***
  • Сообщений: 113
  • +0/-0
  • 0
    • Просмотр профиля
    • http://www.vingrad.ru
Image::Size - это все,  что нужно.
  - качественный хостинг по доступным ценам!
Форум программистов: www.forum.vingrad.ru

Оффлайн Serchey

  • Фанат форума
  • Постоялец
  • ***
  • Сообщений: 216
  • +0/-0
  • 0
    • Просмотр профиля
    • http://www.rivne.ukrtelecom.ua
YA
Я за справедливость! :beer:

 

Sitemap 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28