всмысле, \x00\x00\x00\x00\x00\x00\x00\x00\x00 это яркость
первых трех пикселей, соответственно R, G и B значения...
но код
int x,y,z;
unsigned char * string;
while(*string){
x = (int) * string++;
y = (int) * string++;
z = (int) * string++;
printf ("", x,y,z);
}
вылетает, потому что \x00 это признак конца строки. Хотя на
самом деле это просто число 0. И чего делать в таком
случае? как определять длину строчки? Подскажите
ссылку какуюнибудь или ткните куданибудь в мануал.
тоесть как перебрать посимвольно unsigned char который состоит целиком из нулей, если картинка черная. Хотя где-то в районе www.lib.ru я чиатал, что в принципе, в unsigned char можно писать любое число от 0 до 255 в шестнадцатиричном виде.
Но это не массив, я на вход подаю одну строчку.
Хотя там все сложнее и выглядит полностью так:
#!/usr/bin/perl -w
use strict;
use warnings;
use ExtUtils::testlib;
use Akf;
use Data::Dumper;
use Glib qw(FALSE TRUE);
use Gtk2 -init;
my(@criteria,@a,@res,$pix,$button,@m,$img,$pixbuf,$pixels,$w,$h,$c);
my $image = Gtk2::Image->new;
die "Usage: $0 imagefile\n" unless @ARGV;
$pixbuf = Gtk2::Gdk::Pixbuf->new_from_file ($ARGV[0]);
$pixels = $pixbuf->get_pixels();
#my $pixels="\xff\xff\xff\xff\xff\xff\xff\xff\xff";
my $dim=1;
print Dumper(Akf::getnum($pixels,$dim)),"\n";
если создать картинку в фотошопе, которая залита полностью черной краской, то
сишная функция getnum, которая объявляется тут:
#include "EXTERN.h"
#include "perl.h"
#include "XSUB.h"
#include "ppport.h"
MODULE = Akf PACKAGE = Akf
SV*
getnum(number,dim)
unsigned char * number;
int dim;
INIT:
AV* array;
int size,c;
int r,g,b;
double y;
CODE:
size_t n = strlen(number);
char *a, *b = malloc(n);
// intensity: Y = 0.59G + 0.3R + 0.11B
// size = strlen(number);
printf ("!!! %d\n", n);
int i;
array = newAV();
while(*number){
r = *number++;
g = *number++;
b = *number++;
y=0.59*g+0.3*r+0.11*b;
// printf ("%d %d %d\n", r,g,b);
// printf ("%s ,%s %s" r,g,b);
av_push(array, newSVnv(y));
}
free(mem);
RETVAL = newRV_noinc((SV*)array);
OUTPUT:
RETVAL
вылеатет на первом же нуле, потому что первый
шестнадцатеричный символ в $pixels содержит 0.
вобщем, че делать - не пойму пока...
2mrco, действительно, сейчас хоть как-то заработало и передаю длину.
целый день трахался, а в мануале perldoc perlxs было
The "length(NAME)" Keyword
If one of the input arguments to the C function is the
length of a string argument "NAME", one can substitute the
name of the length-argument by "length(NAME)" in the XSUB
declaration. This argument must be omited when the gener-
ated Perl function is called. E.g.,
void
dump_chars(char *s, short l)
{
short n = 0;
while (n < l) {
printf("s[%d] = \"\\%#03o\"\n", n, (int)s[n]);
n++;
}
}
MODULE = x PACKAGE = x
void dump_chars(char *s, short length(s))
should be called as "dump_chars($string)".
А в Си нет такого типа как "строка". Твоя строка -- это на самом деле массив элементов, каждый из которых имеет тип char (или unsigned char). Нулевой байт в этом массиве имеет специальное значение только для функций, работающих со строками.
У тебя же на самом деле вообще не строка, а просто последовательность байтов. Поэтому функции для работы со строками тебе не катят.