bilevel_png.patch

Costantino Grana, 2012-08-24 04:06 pm

Download (4.2 kB)

 
b/modules/highgui/include/opencv2/highgui/highgui.hpp
176 176
    IMWRITE_JPEG_QUALITY =1,
177 177
    IMWRITE_PNG_COMPRESSION =16,
178 178
    IMWRITE_PNG_STRATEGY =17,
179
	IMWRITE_PNG_BILEVEL =18,
179 180
    IMWRITE_PNG_STRATEGY_DEFAULT =0,
180 181
    IMWRITE_PNG_STRATEGY_FILTERED =1,
181 182
    IMWRITE_PNG_STRATEGY_HUFFMAN_ONLY =2,
b/modules/highgui/include/opencv2/highgui/highgui_c.h
217 217
    CV_IMWRITE_JPEG_QUALITY =1,
218 218
    CV_IMWRITE_PNG_COMPRESSION =16,
219 219
    CV_IMWRITE_PNG_STRATEGY =17,
220
	CV_IMWRITE_PNG_BILEVEL =18,
220 221
    CV_IMWRITE_PNG_STRATEGY_DEFAULT =0,
221 222
    CV_IMWRITE_PNG_STRATEGY_FILTERED =1,
222 223
    CV_IMWRITE_PNG_STRATEGY_HUFFMAN_ONLY =2,
b/modules/highgui/src/grfmt_png.cpp
357 357
                        png_init_io( png_ptr, f );
358 358
                }
359 359

  
360
                int compression_level = 0;
361
                int compression_strategy = Z_RLE;
360
                int compression_level = -1; // Invalid value to allow setting 0-9 as valid
361
                int compression_strategy = Z_RLE; // Default strategy
362
				bool isBilevel = false;
362 363

  
363 364
                for( size_t i = 0; i < params.size(); i += 2 )
364 365
                {
365 366
                    if( params[i] == CV_IMWRITE_PNG_COMPRESSION )
366 367
                    {
367 368
                        compression_level = params[i+1];
368
                        compression_level = MIN(MAX(compression_level, 0), MAX_MEM_LEVEL);
369
                        compression_level = MIN(MAX(compression_level, 0), Z_BEST_COMPRESSION);
369 370
                    }
370 371
                    if( params[i] == CV_IMWRITE_PNG_STRATEGY )
371 372
                    {
372 373
                        compression_strategy = params[i+1];
373 374
                        compression_strategy = MIN(MAX(compression_strategy, 0), Z_FIXED);
374 375
                    }
376
                    if( params[i] == CV_IMWRITE_PNG_BILEVEL )
377
                    {
378
                        isBilevel = params[i+1] != 0;                        
379
                    }
375 380
                }
376 381

  
377 382
                if( m_buf || f )
378 383
                {
379
                    if( compression_level > 0 )
384
                    if( compression_level >= 0 )
380 385
                    {
381
                        png_set_compression_mem_level( png_ptr, compression_level );
386
                        png_set_compression_level( png_ptr, compression_level );
382 387
                    }
383 388
                    else
384 389
                    {
......
389 394
                    }
390 395
                    png_set_compression_strategy(png_ptr, compression_strategy);
391 396

  
392
                    png_set_IHDR( png_ptr, info_ptr, width, height, depth == CV_8U ? 8 : 16,
397
                    png_set_IHDR( png_ptr, info_ptr, width, height, depth == CV_8U ? isBilevel?1:8 : 16,
393 398
                        channels == 1 ? PNG_COLOR_TYPE_GRAY :
394 399
                        channels == 3 ? PNG_COLOR_TYPE_RGB : PNG_COLOR_TYPE_RGBA,
395 400
                        PNG_INTERLACE_NONE, PNG_COMPRESSION_TYPE_DEFAULT,
......
397 402

  
398 403
                    png_write_info( png_ptr, info_ptr );
399 404

  
405
					if (isBilevel)
406
						png_set_packing(png_ptr);
407

  
400 408
                    png_set_bgr( png_ptr );
401 409
                    if( !isBigEndian() )
402 410
                        png_set_swap( png_ptr );