Page 1 of 1
Problem with PixelSetColor
Posted: 2011-06-08T01:23:41-07:00
by edsonlp1
Hi guys! I'm trying to make an average of set of images, making the average of the pixels, but it doesnt work to me.
This is my code:
Code: Select all
for (int i=0; i<1; i++)
{
for (int j=0; j< width; j++)
{
//pixels=PixelGetNextIteratorRow(iterator,&numberwands);
for( int k=0; k < height ; k++)
{
status= MagickGetImagePixelColor(mw,j,k,pw);
//pixell[0] = PixelGetColorAsString(pw);
rojo1 = PixelGetRed(pw);
verde1 = PixelGetGreen(pw);
azul1 = PixelGetBlue(pw);
status= MagickGetImagePixelColor(mw1,j,k,pw1);
rojo2 = PixelGetRed(pw1);
verde2 = PixelGetGreen(pw1);
azul2 = PixelGetBlue(pw1);
rojo = (rojo1+rojo2)/2;
verde = (verde1+verde2)/2;
azul = (azul1+azul2)/2;
PixelSetRed(pw1,rojo);
PixelSetGreen(pw1,verde);
PixelSetBlue(pw1,azul);
}
} //PixelSyncIterator(iterator);
MagickNextImage(mw);
}
I can read every RGB pixel, even operate with them, but the PixelSetRed, PixelSetGreen, PixelSetBlue doesn't work.. What i'm doing wrong?
Thanks for your help!
Re: Problem with PixelSetColor
Posted: 2011-06-08T08:16:31-07:00
by el_supremo
PixelSetRed, PixelSetGreen and PixelSetBlue do not set a pixel in an image. They only change the PixelWand itself.
You need to use pixel iterators to access and modify the pixelwands and then use PixelSyncIterator to write them back into the image.
See my example here which uses iterators:
http://members.shaw.ca/el.supremo/Magic ... dulate.htm
Pete
Re: Problem with PixelSetColor
Posted: 2011-06-08T09:24:46-07:00
by edsonlp1
Thank you Pete.. I've done finally using this code.
Code: Select all
for (int i=0; i<5; i++) //NUMBER OF IMAGES
{
iterator1=NewPixelIterator(mw);
iterator2 = NewPixelIterator (mw1);
for (int j=0; j<height; j++)
{
pixels1=PixelGetNextIteratorRow(iterator1,&numberwands);
pixels2=PixelGetNextIteratorRow(iterator2,&numberwands);
for( int k=0; k < width; k++)
{
PixelGetMagickColor(pixels1[k],&pixel1);
PixelGetMagickColor(pixels2[k],&pixel2);
/*AVERAGE*/
pixelR.red=((pixel1.red + pixel2.red)/2/255);
pixelR.green= ((pixel1.green + pixel2.green)/2/255);
pixelR.blue= ((pixel1.blue + pixel2.blue)/2/255);
/* CONVIERTO A FORMATO RGB(XXX,XXX,XXX)*/
sprintf(conv,"%.2f",pixelR.red);
strcpy(buff,"RGB(");
strcat(buff,conv);
strcat(buff,",");
sprintf(conv,"%.2f",pixelR.green);
strcat(buff,conv);
strcat(buff,",");
sprintf(conv,"%.2f",pixelR.blue);
strcat(buff,conv);
strcat(buff,")");
/* IMPRIMO*/
status = PixelSetColor(pixels2[k],buff);
}
PixelSyncIterator(iterator1);
PixelSyncIterator(iterator2);
}
DestroyPixelIterator(iterator1);
DestroyPixelIterator(iterator2);
MagickNextImage(mw);
MagickResetIterator(mw1);
printf(".");
}
Re: Problem with PixelSetColor
Posted: 2011-06-08T10:47:11-07:00
by el_supremo
You don't need to use PixelSetColor. Your inner loop should work like this:
Code: Select all
for( int k=0; k < width; k++)
{
PixelGetMagickColor(pixels1[k],&pixel1);
PixelGetMagickColor(pixels2[k],&pixel2);
/*AVERAGE*/
PixelSetRed(pixels2[k],(pixel1.red + pixel2.red)/2/255);
PixelSetGreen(pixels2[k],(pixel1.green + pixel2.green)/2/255);
PixelSetBlue(pixels2[k],(pixel1.blue + pixel2.blue)/2/255);
}
and I suspect that you only need to sync iterator2 because pixels1[] hasn't been modified.
Pete
Re: Problem with PixelSetColor
Posted: 2011-06-09T08:01:55-07:00
by edsonlp1
Thanks Pete, but it doesn't work to me that procedure.
The RGB values are not working fine. I'll put my code here
Code: Select all
for (int j=0; j<height; j++)
{
pixels1=PixelGetNextIteratorRow(iterator1,&numberwands);
pixels2=PixelGetNextIteratorRow(iterator2,&numberwands);
for( int k=0; k < width; k++)
{
PixelGetMagickColor(pixels1[k],&pixel1);
PixelGetMagickColor(pixels2[k],&pixel2);
PixelSetRed(pixels2[k],((pixel1.red + pixel2.red)/2)/255);
PixelSetGreen(pixels2[k],((pixel1.green + pixel2.green)/2)/255);
PixelSetBlue(pixels2[k],((pixel1.blue + pixel2.blue)/2)/255);
}
PixelSyncIterator(iterator1);
PixelSyncIterator(iterator2);
}
DestroyPixelIterator(iterator1);
DestroyPixelIterator(iterator2);
MagickNextImage(mw);
MagickResetIterator(mw1);
printf(".");
Thank you again
Re: Problem with PixelSetColor
Posted: 2011-06-09T08:37:43-07:00
by el_supremo
Sorry, this should work and it removes the need for any MagickPixelPackets :
Code: Select all
for( int k=0; k < width; k++)
{
/*AVERAGE*/
PixelSetRed(pixels2[k],(PixelGetRed(pixels1[k]) + PixelGetRed(pixels2[k]))/2);
PixelSetGreen(pixels2[k],(PixelGetGreen(pixels1[k]) + PixelGetGreen(pixels2[k]))/2);
PixelSetBlue(pixels2[k],(PixelGetBlue(pixels1[k]) + PixelGetBlue(pixels2[k]))/2);
}
Pete
Re: Problem with PixelSetColor
Posted: 2011-06-10T01:27:54-07:00
by edsonlp1
Thank you very much Pete!!
Works perfect!!