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 

enter image description here


Comments

Popular posts from this blog

c# - How Configure Devart dotConnect for SQLite Code First? -

java - Copying object fields -

c++ - Clear the memory after returning a vector in a function -