Page 1 of 1
Set and Get RGB values for a specific pixel in an image
Posted: 2015-04-04T19:18:24-07:00
by NukerDoggie
I am new to IM - from the command line, under Windows 7, how would I set the RGB values for a specific pixel?
How would I read the RGB values for a specific pixel?
How do you specify a specific pixel's location for the above operations, if you know the dimensions (in pixels) of the image?
I want to use these operations to get, and then adjust, the RGB values for any single pixel I choose in a PNG or other image.
Re: Set and Get RGB values for a specific pixel in an image
Posted: 2015-04-04T20:28:33-07:00
by fmw42
Method 1:
create a single pixel image of a specific color, then composite over the image at the location desired.
Code: Select all
convert backgroundimage ( -size 1x1 xc:"rgb(rr,gg,bb)" ) -gravity northwest -geometry +X+Y -compose over -composite resultimage
See
http://www.imagemagick.org/Usage/canvas/#solid
http://www.imagemagick.org/Usage/layers/#convert
http://www.imagemagick.org/Usage/basics/#parenthesis
Method 2: (easier)
simply draw a pixel of a given color onto the background image
Code: Select all
convert backgroundimage -fill "rgb(rr,gg,bb)" -draw "color x,y point" resultimage
see
http://www.imagemagick.org/Usage/draw/#primitives
Note I am a unix person, so one of the windows users may have to correct my windows syntax commands above.
See also
http://www.imagemagick.org/Usage/windows/
Re: Set and Get RGB values for a specific pixel in an image
Posted: 2015-04-04T21:17:56-07:00
by NukerDoggie
Thanks for the quick reply, Fred!
Yes, if there is a variation in the commands for Windows, I'd love to have someone post those.
Also - how would I read the current RGB values for a specific pixel so as to know what they are before I set them to something else?
Re: Set and Get RGB values for a specific pixel in an image
Posted: 2015-04-04T22:49:39-07:00
by snibgo
A BAT file (called onePixel.bat) with some methods of reading a single pixel.
For use in "xc:" or "-fill", as shown by Fred, the first of these methods is fine. But it is no good if you want to do some processing on the colour values.
Code: Select all
rem Returns colour of file %1, pixel coordinate %2,%3.
rem ----------------------------------------------------------------
rem Simple version.
FOR /F "usebackq" %%C ^
IN (`%IM%convert %1 -format "%%[pixel:p{%2,%3}]" info:`) ^
DO set ONE_PIXEL=%%C
echo ONE_PIXEL=%ONE_PIXEL%
rem Sample outputs from %[pixel:..]:
rem red
rem cmyk(1,2,3,5)
rem srgb(100%,94.7402%,0%)
rem Having a percentage in an environment variable won't normally cause a problem,
rem provided only one command translation is performed.
rem ----------------------------------------------------------------
rem Intensity.
FOR /F "usebackq" %%C ^
IN (`%IM%convert %1 -format "%%[pixel:p{%2,%3}.r]" info:`) ^
DO set ONE_PIXEL=%%C
echo ONE_PIXEL=%ONE_PIXEL%
rem ----------------------------------------------------------------
rem txt:
%IM%convert xc:%ONE_PIXEL% txt:
rem ----------------------------------------------------------------
rem Three components, range 0.0 to 1.0.
FOR /F "usebackq" %%C ^
IN (`%IM%convert %1 ^
-precision 9 ^
-format "ONE_PIXEL.R=%%[fx:p{%2,%3}.r]\nONE_PIXEL.G=%%[fx:p{%2,%3}.g]\nONE_PIXEL.B=%%[fx:p{%2,%3}.b]" ^
info:`) ^
DO set %%C
echo ONE_PIXEL.R=%ONE_PIXEL.R% ONE_PIXEL.G=%ONE_PIXEL.G% ONE_PIXEL.B=%ONE_PIXEL.B%
rem ----------------------------------------------------------------
rem Three components, range 0.0 to 100.0.
FOR /F "usebackq" %%C ^
IN (`%IM%convert %1 ^
-precision 9 ^
-format "ONE_PIXEL.R=%%[fx:100*p{%2,%3}.r]\nONE_PIXEL.G=%%[fx:100*p{%2,%3}.g]\nONE_PIXEL.B=%%[fx:100*p{%2,%3}.b]" ^
info:`) ^
DO set %%C
echo ONE_PIXEL.R=%ONE_PIXEL.R% ONE_PIXEL.G=%ONE_PIXEL.G% ONE_PIXEL.B=%ONE_PIXEL.B%
rem ...Do any arithmetic here...
set ONE_PIXEL=sRGB(%ONE_PIXEL.R%%%,%ONE_PIXEL.G%%%,%ONE_PIXEL.B%%%)
echo ONE_PIXEL=%ONE_PIXEL%
rem ----------------------------------------------------------------
rem Single colour spec eg "srgb(45%,67.123%,0%)", range 0.0 to 100.0.
FOR /F "usebackq" %%C ^
IN (`%IM%convert %1 ^
-precision 9 ^
-format "ONE_PIXEL=srgb(%%[fx:100*p{%2,%3}.r]\%%,%%[fx:100*p{%2,%3}.g]\%%,%%[fx:100*p{%2,%3}.b]\%%)" ^
info:`) ^
DO set %%C
echo ONE_PIXEL=%ONE_PIXEL%
rem ----------------------------------------------------------------
rem Single colour spec eg "srgb(4545,37867,0)", range 0.0 to QuantumRange eg 65535.
FOR /F "usebackq" %%C ^
IN (`%IM%convert %1 ^
-format "ONE_PIXEL=srgb(%%[fx:int(QuantumRange*p{%2,%3}.r+0.5)],%%[fx:int(QuantumRange*p{%2,%3}.g+0.5)],%%[fx:int(QuantumRange*p{%2,%3}.b+0.5)])" ^
info:`) ^
DO set %%C
echo ONE_PIXEL=%ONE_PIXEL%
rem ----------------------------------------------------------------
rem Hash-format, from crop and txt:. HDRI clips this.
%IM%convert %1 ^
-crop 1x1+%2+%3 +repage ^
txt:
FOR /F "usebackq skip=1 tokens=3" %%C ^
IN (`%IM%convert %1 ^
-crop 1x1+%2+%3 ^
txt:`) ^
DO set ONE_PIXEL=%%C
rem The above doesn't work for older versions of IM that had more spaces.
FOR /F "usebackq skip=1 tokens=6 delims=():, " %%C ^
IN (`%IM%convert %1 ^
-alpha off ^
-crop 1x1+%2+%3 ^
-depth 16 ^
txt:`) ^
DO set ONE_PIXEL=%%C
Re: Set and Get RGB values for a specific pixel in an image
Posted: 2015-04-05T07:36:20-07:00
by NukerDoggie
Thanks snibgo! This helps a lot.
One last request, please - how would I define a region, say a vertical line of pixels starting at origin (x=0,y=0) and ending at x=1, y=240, thus encompassing 240 pixels all at once, and set all their RGB color values to something specific, like "#5500AC" ?
Thanks everyone again for your help - this assists me in getting the feel of the ImageMagick command line.
Re: Set and Get RGB values for a specific pixel in an image
Posted: 2015-04-05T08:03:52-07:00
by snibgo
Code: Select all
convert wizard: -fill #5500ac -draw "rectangle 0,0 0,239" r.png
There are many methods. This one takes a built-in image, draws a rectangle of the fill colour with the given top-left and bottom-right coordinates.
My pages contain loads of Windows BAT examples.
Re: Set and Get RGB values for a specific pixel in an image
Posted: 2015-04-05T08:37:30-07:00
by NukerDoggie
Many thanks snibgo - very helpful - I'll study your pages carefully!
Re: Set and Get RGB values for a specific pixel in an image
Posted: 2015-04-05T13:34:16-07:00
by NukerDoggie
I used Gimp to create a PNG image that is all white, 240 px. by 320 px., named "white-background.png". I set the image mode to the RGB color space before I exported it to a PNG image. When I right-click on the image in Windows Explorer and check properties, it says "Bit depth 24", so I've got RGB here.
Then I used this command to try to change the pixel at 0,0 to red:
convert white-background.png -fill "rgb(ff,00,00)" -draw "color 0,0 point" white-background.png
I get no errors, but when I look at the image, the pixel I changed with IM is black, and Properties now says the image has a bit depth of 1, not 24. So I succeeded in changing the PNG to a grayscale - not what I wanted, of course.
Do I need to specify bit depth or mode in my IM command line to get the correct results? What am I doing wrong here?
Thanks for your help!
Re: Set and Get RGB values for a specific pixel in an image
Posted: 2015-04-05T14:09:22-07:00
by fmw42
Code: Select all
convert white-background.png -fill "rgb(ff,00,00)" -draw "color 0,0 point" white-background.png
You are mixing rgb and hex values. Either use rgb(255,0,0) or #ff0000 for the fill color.
see
http://www.imagemagick.org/script/color-management.php
Re: Set and Get RGB values for a specific pixel in an image
Posted: 2015-04-05T14:18:34-07:00
by NukerDoggie
It worked! Thx so much, and sorry for my newbie mistake!