AlbumShaper  1.0a3
Functions
pointillism.h File Reference
This graph shows which files directly or indirectly include this file:

Go to the source code of this file.

Functions

QImage * pointillismEffect (QString filename, ManipulationOptions *options)

Function Documentation

QImage* pointillismEffect ( QString  filename,
ManipulationOptions options 
)

Definition at line 109 of file pointillism.cpp.

References blackWhiteEffect(), computeLocalGrayVal(), drawDotAt(), editedImage, height, pickRandomPixelWithinBlock(), and width.

Referenced by EditingInterface::applyEffect().

{
  //intialize seed using current time
  srand( unsigned(time(NULL)) );

  //load original image and convert to grayscale
  QImage* originalImage = blackWhiteEffect( filename, NULL );
  
  //construct edited image
  QImage* editedImage = new QImage( originalImage->width(),
                                    originalImage->height(),
                                    originalImage->depth() );

  //fill with white since we'll be drawing black/color dots on top
  editedImage->fill( qRgb(255,255,255) );

  //break image into BLOCK_SIZE x BLOCK_SIZE blocks. iterate over
  //each block and pick a random pixel within. Local
  //average gray value in edited image is > originalImage + thresh
  //then draw a dot at pixel. continue doing this for each block
  //and repeat until ???
  const int BLOCK_SIZE = 8;

  //compute image size in blocks
  int blocksWide = editedImage->width() / BLOCK_SIZE;
  if(blocksWide*BLOCK_SIZE < editedImage->width())
  { blocksWide++; }
  
  int blocksTall = editedImage->height() / BLOCK_SIZE;
  if(blocksTall*BLOCK_SIZE < editedImage->height())
  { blocksTall++; }

  //iterate over image say 100 times, we'll need to fix this outer loop to be smarter?
  int bx,by,x,y;
  for(int i=0; i<10; i++)
  {
    //iterate over all blocks
    for(bx=0; bx<blocksWide; bx++)
    {
      for(by=0; by<blocksTall; by++)
      {
        //pick random pixel within block
        pickRandomPixelWithinBlock( editedImage->width(),
                                    editedImage->height(),
                                    bx, by,
                                    BLOCK_SIZE,
                                    x, y );
        
        double curGrayVal = computeLocalGrayVal( editedImage, x, y );
        double goalGrayVal = computeLocalGrayVal( originalImage, x, y );

        //too bright -> draw dot
        if( curGrayVal > goalGrayVal )
        { drawDotAt( editedImage, x, y, 5 ); }
      }
    }
  }

  //free grayscale form of original image
  delete originalImage;
  originalImage = NULL;
  
  //return pointer to edited image
  return editedImage;      
}