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 );
|