GraphicsMagick 1.1.11 не работает простенький пример

Автор: Ьфдфлрщм Дата: 01.03.2010 11:56 ест следующий код в котором просто в цикле перебираются точки, если точка черная то ее цвет просто надо изменить на нек-ый другой. Проблема в том, что пример не работает: цвета пикселей не меняются и само условие принадлежности к черному цвету не срабатывает.
 Image *image;
  ImageInfo *image_info;
  PixelPacket *p, p2;
  const PixelPacket *p1;
  ExceptionInfo exception;
  ViewInfo *view_1;  

  long y, x, buf_x, buf_y, i, j, prev_x, prev_y;
  float r;
  stackNodePtr stackPtr[ OBJ_COUNT ] = { NULL };	
  stackNodePtr points = NULL;
  
  InitializeMagick( *argv );
  GetExceptionInfo( &exception );
  image_info = CloneImageInfo( ( ImageInfo * ) NULL );
  (void)strcpy( image_info->filename, argv[ 1 ] );
  image = ReadImage( image_info, &exception );
  if( exception.severity != UndefinedException )
    CatchException(&exception);
  if( image == (Image *) NULL ){
    printf( "image == (Image *) NULL
" );
    exit( 1 );
  }	
  
  for( i = 0; i < OBJ_COUNT; i++ ){
    stackPtr[ i ] = NULL;
  }
  
  //view_1 = OpenCacheView( image );
  flag = 0;
  i = 0;
  for (y = 0; y < (long) image->rows; y++ ){
    //p1 = AcquireCacheView( view_1, 0, y, image->columns, 1, &exception );
    //p = GetCacheView( view_1, 0, y, image->columns, 1 );
    p2 = AcquireOnePixel( image, x, y, &exception );
    //if( ( p2 == ( const PixelPacket *) NULL ) || ( p == ( PixelPacket *) NULL )  ){
      //printf( "p == (const PixelPacket *) NULL
" );
      //break;
    //}
    for (x = 0; x < (long) image->columns; x++ ){
      /* do something with p here */
      if( p2.red == 0 && p2.green == 0 && p2.blue == 0 ){
        //segmentation1( image, x, y, DST );
	//if( flag == 1 ){
	  //i++;
	  flag = 0;
	//}//end_if_flag
	p2.red = 222;
	p2.blue = 111;
	p2.green = 111;
	printf("ok
";-);
      }
      printf( "ok1
" );
    }
  }
  
  //CloseCacheView( view_1 );

  if( y < (long) image->rows ){
   /* an exception was thrown */
    CatchException(&exception);
    printf( "an exception was thrown
" );
  }

На лишние переменные не обращайте внимания, т. к. это тестовый пример.
AcquireCacheView - этот вызов используется, т.к. нужно будет рекурсивная обработка изображения. Если у кого есть примеры рекурсивной работы с изображениями с использованием GraphicsMagick, то поделитесь буду рад.
Re: GraphicsMagick 1.1.11 не работает простенький пример 14.03.2010 02:01kosmonavt > само условие принадлежности к черному цвету не срабатывает.

Хм, а как изменения полей p2 сказывается на изображении?

> p2 = AcquireOnePixel( image, x, y, &exception );

А чему равен x если у == 0 ?

PS

> if( p2.red == 0 && p2.green == 0 && p2.blue == 0 )

на глаз вы не отличите RGB == {1,1,1} от RGB == {0,0,0}

ЕМНИП, человеческий глаз приблизительно воспринимает 2^6 оттенков серого, т.е. в грубом приближении, не вдаваясь в тонкости физиологии зрения, связанные с различиями в восприятии красного, голубого и синего, черный цвет будет занимать куб в 3-х мерном пространстве RGB {0..3, 0..3, 0..3} цифрового изображения, поэтому делайте проверку значения цветного пикселя на принадлежность этому кубу. Возможно границы куба нужно будет расширить.
RSS-материал