Solved

# Pixel RGB

Posted on 2000-05-16
Medium Priority
558 Views
I need to read value of pixel color
Canvas.Pixels[x,y]
and to retrive info about red green and blue so I can manipulate with this values and after that I need to put this togather and to set Pixel to new color with canvas.pixels[x,y] := new value;

I have C/Java code but this dont work in Delphi beacouse oprenads are not equal.
C++/Java code

q= Canvas->Pixels[x][y];
//  red=(q >>16) & 0xff ;//| (q<<16);
z= z ? 0 : ((q>>0) & 0xff);//red
z2= z2 ? 0:((q>>8) & 0xff);//green
z3= z3 ? 0:((q>>16) & 0xff);//blue

0
Question by:xtvca
• 3
• 3
• 2
• +2

LVL 6

Accepted Solution

edey earned 120 total points
ID: 2814942
from delphi3.hlp:

If you specify TColor as a specific 4-byte hexadecimal number instead of using the constants defined in the Graphics unit, the low three bytes represent RGB color intensities for blue, green, and red, respectively. The value \$00FF0000 represents full-intensity, pure blue, \$0000FF00 is pure green, and \$000000FF is pure red. \$00000000 is black and \$00FFFFFF is white.

hence you could try:

var
r,g,b : byte;
c : integer;
begin
c : my_canvas.pixels[some_x,some_y];
b := c shr 16;
g := c shr 8;
r := c;
end;

GL
Mike
0

LVL 10

Expert Comment

ID: 2814962
The pixel property is very slow. Are you reading the pixels of a bitmap? Then use scanline instead.
0

LVL 2

Expert Comment

ID: 2815119
FastDIB is a hmm good DIB Class with easy and fast access to Pixels -
http://www.jps.net/gfody
0

LVL 6

Expert Comment

ID: 2815432
or you can try this:

var
r,g,b : byte;
c : integer;
p : PByteArray;
begin
p := my_bitmap.scanline[some_y];
c := p[some_x];
b := c shr 16;
g := c shr 8;
r := c;
end;

this is much faster, esp. if you arange to check pixels all on one scanline, ex.

var
r,g,b : byte;
c,ix,iy : integer;
p : PByteArray;
buf : TBitmap;
begin
buf := TBitmap.create;
buf.pixelFormat := pf24bit;
buf.width := clientWidth;
buf.height := clientHeight;
for iy := 0 to buf.height-1 do
begin
p := buf.scanline[iy];
for ix := 0 to buf.width-1 do
begin
p[ix*3] := ix;  //blue
p[ix*3+1] := ix;//green
p[ix*3+2] := ix;//red
end;
canvas.draw(0,0,buf)//draws a bunch a grey lines to the form
end;

GL
Mike

0

LVL 1

Expert Comment

ID: 2816434
The best option I think is to use the shr option proposed by edey it is the fastest.
There is a easier way to do it that work just as well but is slower you can use windows api functions
r,g,b:byte;
k:tcolor;

r:=GetRValue(Canvas.Pixels[x,y]
)
GetGValue
GetBValue
and
k:=rgb(r,g,b);
Canvas.Pixels[x,y]:=rgb(r,g,b);

I thinks this api's is in the Windows.pas unit.

0

Author Comment

ID: 2816510
Thanks for great response  !
I will accept edey answer beacouse he was first.

Thnks & Regards
Vedran
0

Author Comment

ID: 2816515
P.S. how to put this r,g,b back to integer which represent TColor value ?

0

LVL 1

Expert Comment

ID: 2817381
use the rgb function
RGB(Value1,Value2,Value3)
I am not sure in what order the colours is i think first red than green,blue
the result is a tcolor value
0

LVL 6

Expert Comment

ID: 2817644
Glad to be of service :)

if you need to recreate the TColor (see above for a 24 bit alternative) simply try the reverse, so if

b := c shr 16;
g := c shr 8;
r := c;

then

c := r + (g shl 8) + (b shl 16)

GL
Mike
0

Author Comment

ID: 2818610
Thanks again edey & flooder
0

## Featured Post

Question has a verified solution.

Are you are experiencing a similar issue? Get a personalized answer when you ask a related question.

Have a better answer? Share it in a comment.

Objective: - This article will help user in how to convert their numeric value become words. How to use 1. You can copy this code in your Unit as function 2. than you can perform your function by type this code The Code   (CODE) The Im…
From store locators to asset tracking and route optimization, learn how leading companies are using Google Maps APIs throughout the customer journey to increase checkout conversions, boost user engagement, and optimize order fulfillment. Powered …
To export Lotus Notes to Outlook PST or Exchange and Domino Server files to Exchange Server or PST files with ease, go for Kernel for Lotus Notes to Outlook conversion tool. Through the video, you can watch the conversion process. A common user with…
###### Suggested Courses
Course of the Month7 days, 1 hour left to enroll