(C++) GetPixel
February 24, 2017 · View on GitHub
(C++) GetPixel
GetPixel is a VCL graphics code snippet to get one single TImage pixel's color.
One version of GetPixel uses RGB values, the other uses a TColor value. The version using TColor is already used for the Win32 API. Therefore, I call the VCL function of GetPixel GetPixelVcl.
For the VCL version of GetPixel, I've also added two functions to obtain the average RGB values of a line and square of pixels.
CLX version of GetPixel
//--------------------------------------------------------------------------- #include <cassert> #include <QExtCtrls.hpp> //--------------------------------------------------------------------------- //From http://www.richelbilderbeek.nl/CppGetPixel.htm const TColor GetPixelClx( const TImage * const image, const int x, const int y) { assert(image!=0 && "Image is NULL"); assert(image->Picture->Bitmap!=0 && "Bitmap is NULL"); assert(image->Picture->Bitmap->PixelFormat == pf32bit && "Bitmap must be 32 bit"); assert( x >= 0 && "x coordinat is below zero"); assert( y >= 0 && "y coordinat is below zero"); assert( x < image->Picture->Bitmap->Width && "x coordinat is beyond image width"); assert( y < image->Picture->Bitmap->Height && "y coordinat is beyond image height"); return static_cast<TColor>(RGB( (static_cast<unsigned char*>(image->Picture->Bitmap->ScanLine[y])[x*4+2]), //Red (static_cast<unsigned char*>(image->Picture->Bitmap->ScanLine[y])[x*4+1]), //Green (static_cast<unsigned char*>(image->Picture->Bitmap->ScanLine[y])[x*4+0]) //Blue )); } //--------------------------------------------------------------------------- //From http://www.richelbilderbeek.nl/CppGetPixel.htm void GetPixel( const TImage * const image, const int x, const int y, unsigned char& red, unsigned char& green, unsigned char& blue) { assert(image!=0 && "Image is NULL"); assert(image->Picture->Bitmap!=0 && "Bitmap is NULL"); assert(image->Picture->Bitmap->PixelFormat == pf32bit && "Bitmap must be 32 bit"); assert( x >= 0 && "x coordinat is below zero"); assert( y >= 0 && "y coordinat is below zero"); assert( x < image->Picture->Bitmap->Width && "x coordinat is beyond image width"); assert( y < image->Picture->Bitmap->Height && "y coordinat is beyond image height"); red = (static_cast<unsigned char*>(image->Picture->Bitmap->ScanLine[y])[x*4+2]); green = (static_cast<unsigned char*>(image->Picture->Bitmap->ScanLine[y])[x*4+1]); blue = (static_cast<unsigned char*>(image->Picture->Bitmap->ScanLine[y])[x*4+0]); }
VCL version of GetPixel
//--------------------------------------------------------------------------- #include <cassert> #include <ExtCtrls.hpp> //--------------------------------------------------------------------------- //Get a pixel's TColor value //From http://www.richelbilderbeek.nl/CppGetPixel.htm const TColor GetPixelVcl( const TImage * const image, const int x, const int y) { assert(image!=0 && "Image is NULL"); assert(image->Picture->Bitmap!=0 && "Bitmap is NULL"); assert(image->Picture->Bitmap->PixelFormat == pf24bit && "Bitmap must be 24 bit"); assert( x >= 0 && "x coordinat is below zero"); assert( y >= 0 && "y coordinat is below zero"); assert( x < image->Picture->Bitmap->Width && "x coordinat is beyond image width"); assert( y < image->Picture->Bitmap->Height && "y coordinat is beyond image height"); const unsigned char * const line = static_cast<unsigned char *>(image->Picture->Bitmap->ScanLine[y]); return static_cast<TColor>(RGB( line[x*3+2], //Red line[x*3+1], //Green line[x*3+0] //Blue )); } //--------------------------------------------------------------------------- //Get a pixel's RGB values //From http://www.richelbilderbeek.nl/CppGetPixel.htm void GetPixel( const TImage * const image, const int x, const int y, unsigned char& red, unsigned char& green, unsigned char& blue) { assert(image!=0 && "Image is NULL"); assert(image->Picture->Bitmap!=0 && "Bitmap is NULL"); assert(image->Picture->Bitmap->PixelFormat == pf24bit && "Bitmap must be 24 bit"); assert( x >= 0 && "x coordinat is below zero"); assert( y >= 0 && "y coordinat is below zero"); assert( x < image->Picture->Bitmap->Width && "x coordinat is beyond image width"); assert( y < image->Picture->Bitmap->Height && "y coordinat is beyond image height"); const unsigned char * const line = static_cast<unsigned char *>(image->Picture->Bitmap->ScanLine[y]); red = line[x*3+2]; green = line[x*3+1]; blue = line[x*3+0]; } //--------------------------------------------------------------------------- //Get a line of pixel's average RGB value //From http://www.richelbilderbeek.nl void GetPixel( const TImage * const image, const int x1, const int x2, const int y, unsigned char& red, unsigned char& green, unsigned char& blue) { assert(image!=0 && "Image is NULL"); assert(image->Picture->Bitmap!=0 && "Bitmap is NULL"); assert(image->Picture->Bitmap->PixelFormat == pf24bit && "Bitmap must be 24 bit"); assert( x1 >= 0 && "x1 coordinat is below zero"); assert( x2 >= 0 && "x2 coordinat is below zero"); assert( y >= 0 && "y coordinat is below zero"); assert( x1 < image->Picture->Bitmap->Width && "x1 coordinat is beyond image width"); assert( x2 <= image->Picture->Bitmap->Width && "x2 coordinat is beyond image width"); assert( y < image->Picture->Bitmap->Height && "y coordinat is beyond image height"); assert( x1 < x2); const unsigned char * const line = static_cast<unsigned char *>(image->Picture->Bitmap->ScanLine[y]); const int nPixels = x2 - x1; int sumRed = 0; int sumGreen = 0; int sumBlue = 0; for (int x=x1; x!=x2; ++x) { const unsigned char r = line[x*3+2]; const unsigned char g = line[x*3+1]; const unsigned char b = line[x*3+0]; sumRed+=r; sumGreen+=g; sumBlue+=b; } const int averageRed = sumRed / nPixels; const int averageGreen = sumGreen / nPixels; const int averageBlue = sumBlue / nPixels; assert(averageRed >= 0 && averageRed < 256); assert(averageGreen >= 0 && averageGreen < 256); assert(averageBlue >= 0 && averageBlue < 256); red = averageRed; green = averageGreen; blue = averageBlue; } //--------------------------------------------------------------------------- //Get a square of pixels' average RGB value //From http://www.richelbilderbeek.nl void GetPixel( const TImage * const image, const int x1, const int y1, const int x2, const int y2, unsigned char& red, unsigned char& green, unsigned char& blue) { assert(x1 < x2 ); assert(y1 < y2 ); const int nPixelsVertical = y2 - y1; int sumRed = 0; int sumGreen = 0; int sumBlue = 0; for (int y=y1; y!=y2; ++y) { unsigned char r,g,b; GetPixel(image,x1,x2,y,r,g,b); sumRed+=r; sumGreen+=g; sumBlue+=b; } const int averageRed = sumRed / nPixelsVertical; const int averageGreen = sumGreen / nPixelsVertical; const int averageBlue = sumBlue / nPixelsVertical; assert(averageRed >= 0 && averageRed < 256); assert(averageGreen >= 0 && averageGreen < 256); assert(averageBlue >= 0 && averageBlue < 256); red = averageRed; green = averageGreen; blue = averageBlue; } //---------------------------------------------------------------------------