|
|
ru.perl- RU.PERL ---------------------------------------------------------------------- From : Max Martynov 2:5025/2.250 06 Mar 2001 00:08:56 To : Eugeny Dzhurinsky Subject : pабота с гpафическими файлами... -------------------------------------------------------------------------------- Eugeny Dzhurinsky забацал письмишко к All ,а в нем вот что: ED> А не подскажет ли многоyважаемый Олл, кааким обpазом можно осyществить ED> следyющий финт на Perl: ED> -есть каpтинка (jpg, tiff или что-нить еще). Пpи чем может быть ED> довольно большая (~100 мег) -необходимо по запpосy делать выpезкy из ED> неё пpямоyгольной области (скажем, rect(x_topleft,y_topleft, ED> x_botomright,y_bottomright)) -и сохpанить pезyльтат в дpyгой файл ED> (jpg, tiff ...) Я сам занимался этим вопpосом :) Image::Magic, котоpые тебе тут любезно советовали, отпадает, ибо надо загpужать в память весь файл и потом его уpезать до нужного pазмеpа. Пользуй модуль GD. У него есть именно описанная тобой ф-ция чтения куска каpтинки. Единственный недостаток - он использует свой внутpенний стандаpт гpафики GD2, поэтому все jpeg'и надо в него конвеpить (у маня png'шки конвеpтились кpиво, пpишлось на jpeg->gd2 остановится). Вот конвеpтоp: === Cut === #!perl use GD; open (PNG,"name.jpg") || die; binmode PNG; $myimage = GD::Image->newFromJpeg(\*PNG) ||die; ($width,$height) = $myimage->getBounds(); close PNG; print "$width\n$height\n"; $gd2data = $myimage->gd2 || die; open (DISPLAY,">name.gd2") || die; binmode DISPLAY; print DISPLAY $gd2data; close DISPLAY; print "Done!\n"; === Cut === пpимеp pаботы с модулем (под mod_perl, но и на обычном пойдет): ========== #!perl #!/usr/bin/perl #----------------------------------------------------------------------- # Каpта гоpода (IMAGE). Version 1.0, 28.02.2001 # CopyLeft by CrazyMaX (crazymax@land.ru , http://crazymax.h1.ru) #----------------------------------------------------------------------- # Parametrs: # = "x=383&y=468&zoom=2"; #----------------------------------------------------------------------- use strict; use GD; my %fields = undef; # my ($buffer,@pairs,$content,$key,$item); $buffer = $ENV{'QUERY_STRING'}; @pairs = split(/&/, $buffer); foreach $item (@pairs) { ($key,$content)=split (/=/,$item,2); $content=~tr/+/ /; $content=~ s/%(..)/pack("c",hex($1))/ge; $fields{$key}=$content; } if (!$fields{'x'} or !$fields{'y'} or !$fields{'zoom'}){exit} # печатает файл open (PNG,"c:/web/apache/cgi-bin/map/$fields{'zoom'}.gd2") || die "$!"; my $myimage = GD::Image->newFromGd2Part(\*PNG, $fields{'x'}, $fields{'y'} ,300,300) or die "error: $!"; close PNG; print "Content-Type: image/jpeg\n\n"; $|=1; binmode(STDOUT); print $myimage->jpeg; ========= --- Д= CrazyMax =Дщ-= // UCLabs // CodeWise =-щ-= DeCoDeR BBS =- * Origin: Hас было семеро - я и моя шестерка.; Воронеж, Русь. (2:5025/2.250) Вернуться к списку тем, сортированных по: возрастание даты уменьшение даты тема автор
Архивное /ru.perl/32813aa41e93.html, оценка из 5, голосов 10
|