trans_graph.C:   Demonstrates how to access and manipulate ARGB pixel values of an image +...
 
//  Demonstrates how to access and manipulate ARGB pixel values of an image +...
//  - how to make a part of an image to be transparent.
//  - how to merge/alphablend an image with transparent colors
//    with some background image.
//Author: Valeriy Onuchin
#include "TColor.h"
#include "TImage.h"
#include "TImageDump.h"
#include "TVirtualPad.h"
#include "TROOT.h"
#include "TFrame.h"
static UInt_t color2rgb(TColor *col)
{
   // returns RGB value of color
   return ((UInt_t(col->GetRed()*255) << 16) +
           (UInt_t(col->GetGreen()*255) << 8) +
            UInt_t(col->GetBlue()*255));
}
void trans_graph()
{
   // remember if  we are in batch mode
   Bool_t batch = gROOT->IsBatch();
   // switch to batch mode
   gROOT->SetBatch(kTRUE);
   // execute graph.C macro
   gROOT->Macro("$ROOTSYS/tutorials/graphs/graph.C");
   // create gVirtualPS object
   TImageDump dmp("dummy.png");
   TImage *fore = dmp.GetImage();  // image associated with image_dump
   // resize canvas
   gPad->SetCanvasSize(400, 300);
   gPad->Paint(); // paint gPad on fore image associated with TImageDump
   // open background image
   TImage *back = TImage::Open("$ROOTSYS/tutorials/image/rose512.jpg");
   // choose colors to be transparent
   TColor *bk1 = gROOT->GetColor(gPad->GetFillColor());
   TColor *bk2 = gROOT->GetColor(gPad->GetFrame()->GetFillColor());
   UInt_t rgb1 = color2rgb(bk1);
   UInt_t rgb2 = color2rgb(bk2);
   // get directly accessible ARGB array
   UInt_t *argb = fore->GetArgbArray();
   UInt_t w = fore->GetWidth();
   UInt_t h = fore->GetHeight();
   // scan all pixels in fore image and
   // make rgb1, rgb2 colors transparent.
   for (UInt_t i = 0; i < h; i++) {
      for (UInt_t j = 0; j < w; j++) {
         Int_t idx = i*w + j;
         // RGB part of ARGB color
         UInt_t col = argb[idx] & 0xffffff;
         // 24..31 bits define transparency of the color in the range 0 - 0xff
         // for example, 0x00000000 - black color with 100% transparency
         //              0xff000000 - non-transparent black color
         if ((col == rgb1) || (col == rgb2)) { //
            argb[idx] = 0; // 100% transparent
         } else {
            argb[idx] = 0xff000000 + col;  // make other pixels non-transparent
         }
      }
   }
   // alphablend back and fore images
   back->Merge(fore, "alphablend", 20, 20);
   // write result image in PNG format
   back->WriteImage("trans_graph.png");
   printf("*************** File trans_graph.png created ***************\n");
   delete back;
   // switch back to GUI mode
   if (!batch) gROOT->SetBatch(kFALSE);
}
Last change: Wed Dec 17 10:56:30 2008
Last generated: 2008-12-17 10:56
This page has been automatically generated. If you have any comments or suggestions about the page layout send a mail to ROOT support, or contact the developers with any questions or problems regarding ROOT.