webForumDet fria alternativet

GD -> GetPixel ..

2 svar · 356 visningar · startad av jvg

jvgMedlem sedan feb. 20003 inlägg
#1

Goddagens..

Har ett litet perl-script som "läser in" en PNG bild och konverterar varje pixel i denna bild till en etta resp. nolla. PNG bilden består bara av två färger, svart och grön. Grön blir en nolla och svart en etta.

#!/usr/bin/perl -w
use strict;
use GD;

my $png = 'bild.png';
open(PNG, $png) or die "Kan inte öppna $png: $!";
my $gd = GD::Image->newFromPng(\*PNG) | | 
	die "$png är nog ingen PNG fil..";
close PNG;

my ($width, $height) = $gd->getBounds();

my $bit_string = '';

for (my $x = 0; $x < $width; $x++)
{
	for (my $y = 0; $y < $height; $y++)
	{
		my $index = $gd->getPixel($x, $y);
		my ($r, $g, $b) = $gd->rgb($index);

		if ($g > 2 )
		{
			$bit_string.= '0';
		}
		else
		{
			$bit_string.= '1';
		}
	}
}
print "$bit_string \n";

Problemet är att detta script läser PNG bilden kolumn för kolumn, börjar på pixeln högst upp till vänster och läser den kolumnen. Försätter sedan till nästa kolumn högst upp och läser den. Jag vill att det ska läsa varje rad, börja högst upp till vänster och läsa hela raden sedan hoppa ned till nästa rad och börja längst till vänster osv. Har provat allt (nästan) men det vill inte riktigt..

Några tips?

/jvg

RobbanMedlem sedan dec. 19992 272 inlägg
#2

Problemet är att detta script läser PNG bilden kolumn för kolumn, börjar på pixeln högst upp till vänster och läser den kolumnen. Försätter sedan till nästa kolumn högst upp och läser den.

Är ju så dina loopar är uppbyggda. Fungerar det inte att bara byta plats på FOR-looparna?

...

for (my $y = 0; $y < $height; $y++)
{
for (my $x = 0; $x < $width; $x++)
{
my $index = $gd->getPixel($x, $y);
my ($r, $g, $b) = $gd->rgb($index);

if ($g > 2 )
{
$bit_string.= '0';
}
else
{
$bit_string.= '1';
}
}
}

...

------------------
Robban < robban@lipogram.com >

jvgMedlem sedan feb. 20003 inlägg
#3

Jo.. naturligtvis är det så :r

Tack!

Genererad på 379 ms · cache AV · v20260730165559-full.f96bc7eb