Есть строчка пикселей $pixels, в которой картинка содержится в виде \x00\xff ... и тому подобное длиной $w*$h*$n ($n - число цветов CMYK или RGB). Я возюкаю мышкой на виджете картинки и над картинкой появляется увеличенное изображение в квадратике(типа квадратная такая лупа). $scale - масштаб, только увеличение... уменьшение perl под XWindow не потяет, либо как то убыстрять.
Код который ответственнен за координаты (высчитывает положение центра курсора на картинке и соответственно высчитывает нужные яркости пикселей в строке пикселей. $i, $j - номера точек в двумерном массиве цифр, соответствующем картинке, $x,$y - координаты курсора, $k размер квадратика,в центре которого находится курсор и который надо увеличивать, $jj не помню какой параметр):
my $preview;
for my $i(1 .. $k){
my $r = substr $pixels, 3*($x-$k/2)+($i+$y-$k/2)*($w*3+$jj), $k*3;
$preview.=$r;
}
Код, который удваивает(удесятеряет и т.п.) каждый пиксель. Т.е. только в длину вдвое длинней. вот, короче тупой и злобный код, зато иногда работает... :)
if($scale!=1){$preview=~s/(...)/$1 x $scale/gex;}
Код который строку пикселей превращает в картинку(но это из библиотеки, потому тут ниче интересного нет):
# print length $preview," \n";
$pixbuf = Gtk2::Gdk::Pixbuf->new_from_data
($preview, # packed image data in a scalar
'rgb', # only 24- or 32-bit RGB are supported
0, # no alpha, data is 24-bit
8, # only 8 bits per sample are supported
$k*$scale, # in pixels
$k*$scale, # in pixels
$k*$scale*3); # number of *bytes* in each row
$preview='';