Blob Blame Raw


#ifdef _WIN32
#pragma warning(disable : 4996)
#endif

#include "tiio_jpg_util.h"
//#include "tiio.h"
#include "tiio_jpg.h"
#include "tproperty.h"
#include <stdio.h>
#include "tfilepath_io.h"
#include "tsystem.h"

void Tiio::createJpg(std::vector<UCHAR> &buffer, const TRaster32P &ras,
                     int quality) {
  // FILE *chan = tmpfile();
  TFilePath fname = TSystem::getUniqueFile();
  FILE *chan      = fopen(fname, "w+b");
  if (chan == 0) throw TException(L". Can not create " + fname.getWideString());

  assert(chan);
  assert(ras);
  assert(0 <= quality && quality <= 100);
  fflush(chan);
  Tiio::Writer *writer = Tiio::makeJpgWriter();
  assert(writer);
  TPropertyGroup *pg = writer->getProperties();
  if (!pg) {
    writer->setProperties(new JpgWriterProperties());
    pg = writer->getProperties();
  }

  TProperty *qualityProp = pg->getProperty(JpgWriterProperties::QUALITY);
  assert(qualityProp);
  TIntProperty *ip = dynamic_cast<TIntProperty *>(qualityProp);
  assert(ip);
  ip->setValue(quality);
  int lx = ras->getLx();
  int ly = ras->getLy();
  assert(lx > 0 && ly > 0);
  writer->open(chan, TImageInfo(lx, ly));

  ras->lock();
  for (int y = 0; y < ly; y++)
    writer->writeLine((char *)ras->getRawData(0, ly - 1 - y));
  ras->unlock();
  writer->flush();
  delete writer;
  fclose(chan);

  // lo chiudo e lo riapro: altrimenti, gettava male  la filesize. boh.
  FILE *chan1 = fopen(fname, "rb");
  if (chan1 == 0)
    throw TException(L". Can not create " + fname.getWideString());
  int ret = fseek(chan1, 0, SEEK_END);
  assert(ret == 0);
  int fileSize = ftell(chan1);

  buffer.resize(fileSize);
  ret = fseek(chan1, 0, SEEK_SET);
  assert(ret == 0);
  for (int i = 0; i < fileSize; i++) {
    int c = fgetc(chan1);
    assert(!feof(chan1));
    buffer[i] = c;
  }

  fclose(chan1);
  TSystem::deleteFile(fname);
}