ROOT logo

From $ROOTSYS/tutorials/image/trans_graph.C

//  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);
}
 trans_graph.C:1
 trans_graph.C:2
 trans_graph.C:3
 trans_graph.C:4
 trans_graph.C:5
 trans_graph.C:6
 trans_graph.C:7
 trans_graph.C:8
 trans_graph.C:9
 trans_graph.C:10
 trans_graph.C:11
 trans_graph.C:12
 trans_graph.C:13
 trans_graph.C:14
 trans_graph.C:15
 trans_graph.C:16
 trans_graph.C:17
 trans_graph.C:18
 trans_graph.C:19
 trans_graph.C:20
 trans_graph.C:21
 trans_graph.C:22
 trans_graph.C:23
 trans_graph.C:24
 trans_graph.C:25
 trans_graph.C:26
 trans_graph.C:27
 trans_graph.C:28
 trans_graph.C:29
 trans_graph.C:30
 trans_graph.C:31
 trans_graph.C:32
 trans_graph.C:33
 trans_graph.C:34
 trans_graph.C:35
 trans_graph.C:36
 trans_graph.C:37
 trans_graph.C:38
 trans_graph.C:39
 trans_graph.C:40
 trans_graph.C:41
 trans_graph.C:42
 trans_graph.C:43
 trans_graph.C:44
 trans_graph.C:45
 trans_graph.C:46
 trans_graph.C:47
 trans_graph.C:48
 trans_graph.C:49
 trans_graph.C:50
 trans_graph.C:51
 trans_graph.C:52
 trans_graph.C:53
 trans_graph.C:54
 trans_graph.C:55
 trans_graph.C:56
 trans_graph.C:57
 trans_graph.C:58
 trans_graph.C:59
 trans_graph.C:60
 trans_graph.C:61
 trans_graph.C:62
 trans_graph.C:63
 trans_graph.C:64
 trans_graph.C:65
 trans_graph.C:66
 trans_graph.C:67
 trans_graph.C:68
 trans_graph.C:69
 trans_graph.C:70
 trans_graph.C:71
 trans_graph.C:72
 trans_graph.C:73
 trans_graph.C:74
 trans_graph.C:75
 trans_graph.C:76
 trans_graph.C:77
 trans_graph.C:78
 trans_graph.C:79
 trans_graph.C:80
 trans_graph.C:81
 trans_graph.C:82
 trans_graph.C:83
 trans_graph.C:84
 trans_graph.C:85
 trans_graph.C:86
 trans_graph.C:87
 trans_graph.C:88
 trans_graph.C:89
 trans_graph.C:90