|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
#ifdef WIN32
|
|
Toshihiro Shimizu |
890ddd |
#pragma warning(disable : 4996)
|
|
Toshihiro Shimizu |
890ddd |
#endif
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
#include "tiio_jpg_util.h"
|
|
Toshihiro Shimizu |
890ddd |
//#include "tiio.h"
|
|
Toshihiro Shimizu |
890ddd |
#include "tiio_jpg.h"
|
|
Toshihiro Shimizu |
890ddd |
#include "tproperty.h"
|
|
Toshihiro Shimizu |
890ddd |
#include <stdio.h></stdio.h>
|
|
Toshihiro Shimizu |
890ddd |
#include "tfilepath_io.h"
|
|
Toshihiro Shimizu |
890ddd |
#include "tsystem.h"
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
void Tiio::createJpg(
|
|
Toshihiro Shimizu |
890ddd |
std::vector<uchar> &buffer,</uchar>
|
|
Toshihiro Shimizu |
890ddd |
const TRaster32P &ras,
|
|
Toshihiro Shimizu |
890ddd |
int quality)
|
|
Toshihiro Shimizu |
890ddd |
{
|
|
Toshihiro Shimizu |
890ddd |
//FILE *chan = tmpfile();
|
|
Toshihiro Shimizu |
890ddd |
TFilePath fname = TSystem::getUniqueFile();
|
|
Toshihiro Shimizu |
890ddd |
FILE *chan = fopen(fname, "w+b");
|
|
Toshihiro Shimizu |
890ddd |
if (chan == 0)
|
|
Toshihiro Shimizu |
890ddd |
throw TException(L". Can not create " + fname.getWideString());
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
assert(chan);
|
|
Toshihiro Shimizu |
890ddd |
assert(ras);
|
|
Toshihiro Shimizu |
890ddd |
assert(0 <= quality && quality <= 100);
|
|
Toshihiro Shimizu |
890ddd |
fflush(chan);
|
|
Toshihiro Shimizu |
890ddd |
Tiio::Writer *writer = Tiio::makeJpgWriter();
|
|
Toshihiro Shimizu |
890ddd |
assert(writer);
|
|
Toshihiro Shimizu |
890ddd |
TPropertyGroup *pg = writer->getProperties();
|
|
Toshihiro Shimizu |
890ddd |
if (!pg) {
|
|
Toshihiro Shimizu |
890ddd |
writer->setProperties(new JpgWriterProperties());
|
|
Toshihiro Shimizu |
890ddd |
pg = writer->getProperties();
|
|
Toshihiro Shimizu |
890ddd |
}
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
TProperty *qualityProp = pg->getProperty(JpgWriterProperties::QUALITY);
|
|
Toshihiro Shimizu |
890ddd |
assert(qualityProp);
|
|
Toshihiro Shimizu |
890ddd |
TIntProperty *ip = dynamic_cast<tintproperty *="">(qualityProp);</tintproperty>
|
|
Toshihiro Shimizu |
890ddd |
assert(ip);
|
|
Toshihiro Shimizu |
890ddd |
ip->setValue(quality);
|
|
Toshihiro Shimizu |
890ddd |
int lx = ras->getLx();
|
|
Toshihiro Shimizu |
890ddd |
int ly = ras->getLy();
|
|
Toshihiro Shimizu |
890ddd |
assert(lx > 0 && ly > 0);
|
|
Toshihiro Shimizu |
890ddd |
writer->open(chan, TImageInfo(lx, ly));
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
ras->lock();
|
|
Toshihiro Shimizu |
890ddd |
for (int y = 0; y < ly; y++)
|
|
Toshihiro Shimizu |
890ddd |
writer->writeLine((char *)ras->getRawData(0, ly - 1 - y));
|
|
Toshihiro Shimizu |
890ddd |
ras->unlock();
|
|
Toshihiro Shimizu |
890ddd |
writer->flush();
|
|
Toshihiro Shimizu |
890ddd |
delete writer;
|
|
Toshihiro Shimizu |
890ddd |
fclose(chan);
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
//lo chiudo e lo riapro: altrimenti, gettava male la filesize. boh.
|
|
Toshihiro Shimizu |
890ddd |
FILE *chan1 = fopen(fname, "rb");
|
|
Toshihiro Shimizu |
890ddd |
if (chan1 == 0)
|
|
Toshihiro Shimizu |
890ddd |
throw TException(L". Can not create " + fname.getWideString());
|
|
Toshihiro Shimizu |
890ddd |
int ret = fseek(chan1, 0, SEEK_END);
|
|
Toshihiro Shimizu |
890ddd |
assert(ret == 0);
|
|
Toshihiro Shimizu |
890ddd |
int fileSize = ftell(chan1);
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
buffer.resize(fileSize);
|
|
Toshihiro Shimizu |
890ddd |
ret = fseek(chan1, 0, SEEK_SET);
|
|
Toshihiro Shimizu |
890ddd |
assert(ret == 0);
|
|
Toshihiro Shimizu |
890ddd |
for (int i = 0; i < fileSize; i++) {
|
|
Toshihiro Shimizu |
890ddd |
int c = fgetc(chan1);
|
|
Toshihiro Shimizu |
890ddd |
assert(!feof(chan1));
|
|
Toshihiro Shimizu |
890ddd |
buffer[i] = c;
|
|
Toshihiro Shimizu |
890ddd |
}
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
fclose(chan1);
|
|
Toshihiro Shimizu |
890ddd |
TSystem::deleteFile(fname);
|
|
Toshihiro Shimizu |
890ddd |
}
|