Povodom PNG formata ima nekoliko opcija.
1. libpng -
http://www.libpng.org/pub/png/libpng.html
Ovo je referentna implementacija biblioteke za manipulaciju slika u png formatu. Potpuno je portabilna i nudi sve sto je neophodno za rad sa png datotekama. Potrebno je malo vremena dok se pohvataju konci ali se sve to na kraju isplati.
2. GDI+ - microsoftova graficka biblioteka koja podrzava sve standardne image formate pa i PNG. Karakterisu je odlicne klase isporucene uz platform sdk i jednostavnost upotrebe.
Na primer:
Code:
#include <windows.h>
#include <tchar.h>
#include <ole2.h>
#include <string>
#include <GdiPlus.h>
#pragma comment(lib,"gdiplus.lib")
#ifdef __BORLANDC__
#include <cstddef> //to add size_t
#include <algorithm>
using std::min;
using std::max;
#endif //__BORLANDC__
typedef std::basic_string<TCHAR> tstring;
struct gdi_init{
gdi_init(void) : m_gdip(0), m_status(false) {
Gdiplus::GdiplusStartupInput m_input;
m_status = ( Gdiplus::GdiplusStartup(&m_gdip, &m_input, NULL) == Gdiplus::Ok );
}
~gdi_init(void){
if (m_status) {
Gdiplus::GdiplusShutdown(m_gdip);
m_status = false;
m_gdip = 0;
}
}
private:
gdi_init(const gdi_init& rhs);
ULONG_PTR m_gdip;
volatile bool m_status;
};
int GetEncoderClsid(const WCHAR* format, CLSID* pClsid)
{
UINT num = 0; // number of image encoders
UINT size = 0; // size of the image encoder array in bytes
Gdiplus::ImageCodecInfo* pImageCodecInfo = NULL;
Gdiplus::GetImageEncodersSize(&num, &size);
if(size == 0)
return -1; // Failure
pImageCodecInfo = (Gdiplus::ImageCodecInfo*)(malloc(size));
if(pImageCodecInfo == NULL)
return -1; // Failure
Gdiplus::GetImageEncoders(num, size, pImageCodecInfo);
for(UINT j = 0; j < num; ++j)
{
if( wcscmp(pImageCodecInfo[j].MimeType, format) == 0 )
{
*pClsid = pImageCodecInfo[j].Clsid;
free(pImageCodecInfo);
return j; // Success
}
}
free(pImageCodecInfo);
return -1; // Failure
}
bool ConvertImageToPNG(const tstring& imgfile, const tstring& pngfile) {
gdi_init in;
CLSID encoderClsid = {0};
Gdiplus::Image ig(imageile.c_str());
GetEncoderClsid(L"image/png", &encoderClsid);
Gdiplus::Bitmap bmp( (width > 0) ? width : ig.GetWidth(),
(height > 0) ? height : ig.GetHeight(),
PixelFormat32bppRGB);
Gdiplus::Graphics gr(&bmp);
Gdiplus::Color backColor(0,0,0);
gr.Clear(backColor);
gr.DrawImage(&ig,0,0);
Gdiplus::EncoderParameters* encoderParameters = (Gdiplus::EncoderParameters*)
malloc(sizeof(Gdiplus::EncoderParameters) + sizeof(Gdiplus::EncoderParameter));
encoderParameters->Count = 1;
encoderParameters->Parameter[0].Guid = Gdiplus::EncoderQuality;
encoderParameters->Parameter[0].Type = Gdiplus::EncoderParameterValueTypeLong;
encoderParameters->Parameter[0].NumberOfValues = 1;
int quality = 95;
encoderParameters->Parameter[0].Value = &quality;
Gdiplus::Status stat = bmp.Save(pngfile.c_str(), &encoderClsid, encoderParameters);
free(encoderParameters);
return (stat == Gdiplus::Ok);
}
int main(void) {
ConvertImageToPNG(_T("nekifajl.bmp", _T("nekifajl.png") ));
return 0;
}
Tko leti vrijedi