c++ - WIC increases the size of TIFF image -
scenario: load tiff image , extract frames of tiff image , save locally. combine extracted frames output tiff image. when try combine frames, size of output tiff image increasing drastically. example if input size if 40 mb , output increased 300 mb. below code explains scenario,
void readtiff() { hresult hr; iwicbitmapframedecode *framedecode = null; iwicformatconverter *formatconverter = null; iwicbitmapencoder *encoder = null; iwicstream *poutstream = null; iwicbitmapframeencode *frameencode = null; iwicimagingfactory* m_pwicfactory; hr = cocreateinstance( clsid_wicimagingfactory, null, clsctx_inproc_server, iid_ppv_args(&m_pwicfactory) ); iwicbitmapdecoder *pidecoder = null; hr = m_pwicfactory->createdecoderfromfilename( l"d:\\test28\\multitiff_files\\300dpitiff40mb_water.tif", // image decoded null, // not prefer particular vendor generic_read, // desired read access file wicdecodemetadatacacheondemand, // cache metadata when needed &pidecoder // pointer decoder ); uint framecount = 0; pidecoder->getframecount(&framecount); (int = 0; < framecount; i++) { wchar_t temp[200]; int j = i; swprintf_s(temp, 200, l"d:\\test28\\multitiff_files\\out\\filename_png%d.jpeg", i); if (succeeded(hr)) hr = m_pwicfactory->createstream(&poutstream); if (succeeded(hr)) hr = poutstream->initializefromfilename(temp, generic_write); if (succeeded(hr)) hr = m_pwicfactory->createencoder(guid_containerformatjpeg, null, &encoder); if (succeeded(hr)) hr = encoder->initialize(poutstream, wicbitmapencodernocache); hr = pidecoder->getframe(i, &framedecode); if (succeeded(hr)) hr = m_pwicfactory->createformatconverter(&formatconverter); hr = formatconverter->initialize( framedecode, // source frame convert guid_wicpixelformat8bppindexed, // desired pixel format wicbitmapdithertypenone, // desired dither pattern null, // desired palette 0.f, // desired alpha threshold wicbitmappalettetypemediancut // palette translation type ); ipropertybag2 *ppropertybag = null; //create new frame.. hr = encoder->createnewframe(&frameencode, &ppropertybag); //propbag2 option = { 0 }; //option.pstrname = l"imagequality"; //variant varvalue; //variantinit(&varvalue); //varvalue.vt = vt_r4; //varvalue.fltval = 0.01f; //hr = ppropertybag->write( // 1, // number of properties being set // &option, // &varvalue); wicpixelformatguid pixelformat; hr = frameencode->initialize(ppropertybag); //pixelformat = guid_wicpixelformat8bppindexed; framedecode->getpixelformat(&pixelformat); hr = frameencode->setpixelformat(&pixelformat); hr = frameencode->writesource(formatconverter, null); frameencode->commit(); encoder->commit(); if (formatconverter) formatconverter->release(); if (framedecode) framedecode->release(); if (frameencode) frameencode->release(); if (poutstream) poutstream->release(); if (encoder) encoder->release(); } if (m_pwicfactory) m_pwicfactory->release(); pidecoder->release(); } void combinefile(int count) { hresult hr; iwicimagingfactory *pfactory = null; iwicstream *pinstream = null; iwicbitmapdecoder *decoder = null; iwicbitmapframedecode *framedecode = null; iwicformatconverter *formatconverter = null; iwicbitmapencoder *encoder = null; iwicstream *poutstream = null; iwicbitmapframeencode *frameencode = null; hr = cocreateinstance(clsid_wicimagingfactory, null, clsctx_inproc_server, iid_iwicimagingfactory, (lpvoid*)&pfactory); if (!succeeded(hr)) { hr = cocreateinstance(clsid_wicimagingfactory, null, clsctx_inproc_server, iid_iwicimagingfactory, (lpvoid*)&pfactory); } if (succeeded(hr)) hr = pfactory->createstream(&poutstream); if (succeeded(hr)) hr = poutstream->initializefromfilename(l"d:\\test28\\multitiff_files\\out\\out.tiff", generic_write); if (succeeded(hr)) hr = pfactory->createencoder(guid_containerformatwmp, null, &encoder); if (succeeded(hr)) hr = encoder->initialize(poutstream, wicbitmapencodernocache); (int = 0; < count; i++) { wchar_t temp[200]; swprintf_s(temp, 200, l"d:\\test28\\multitiff_files\\out\\filename_png%d.jpeg", i); if (succeeded(hr)) hr = pfactory->createstream(&pinstream); if (succeeded(hr)) hr = pinstream->initializefromfilename(temp, generic_read); if (succeeded(hr)) hr = pfactory->createdecoderfromstream(pinstream, null, wicdecodemetadatacacheonload, &decoder); if (succeeded(hr)) hr = pfactory->createformatconverter(&formatconverter); hr = decoder->getframe(0, &framedecode); //hr = formatconverter->initialize( // framedecode, // source frame convert // guid_wicpixelformat8bppindexed, // desired pixel format // wicbitmapdithertypenone, // desired dither pattern // null, // desired palette // 0.f, // desired alpha threshold // wicbitmappalettetypemediancut // palette translation type // ); wicpixelformatguid pixelformat; framedecode->getpixelformat(&pixelformat); ipropertybag2 *ppropertybag = null; //create new frame.. hr = encoder->createnewframe(&frameencode, &ppropertybag); propbag2 option = { 0 }; option.pstrname = l"tiffcompressionmethod"; variant varvalue; variantinit(&varvalue); varvalue.vt = vt_ui1; varvalue.bval = wictiffcompressionoption::wictiffcompressionzip; hr = ppropertybag->write(1, &option, &varvalue); hr = frameencode->initialize(ppropertybag); hr = frameencode->setpixelformat(&pixelformat); hr = frameencode->writesource(formatconverter, null); hr = frameencode->commit(); if (pinstream) pinstream->release(); if (decoder) decoder->release(); if (formatconverter) formatconverter->release(); if (frameencode) frameencode->release(); //if (framedecode) //framedecode->release(); } encoder->commit(); if (pfactory) pfactory->release(); if (encoder) encoder->release(); if (poutstream) poutstream->release(); }
one easy way debug kind of issue use imagemagick installed on linux distros , available osx , windows. first use identify
utility within suite verbose
option find out before , after images this:
# find out know first image , put in file "1.txt" identify -verbose image1.tif > 1.txt # find out know second image , put in file "2.txt" identify -verbose image2.tif > 2.txt
now use favourite file comparison tool see differences:
opendiff 1.txt 2.txt
Comments
Post a Comment