Jag gav upp att undersöka varför GdiPlus inte funkade, och använde libtiff istället. Det är ju ändå bara tiff-bilder jag är intresserad av att komprimera.
Jag skriver ett program som ska konvertera bilder till ECW-formatet (http://www.ermapper.com/ecw/ för den som undrar). Med deras SDK följer det med ett exempel där man börjar med att läsa in en fil med GdiPlus. Därefter komprimeras den med deras SDK-bibliotek. Detta exempel har jag byggt vidare på. Målet är att konvertera flygfoton i tiff-format till ecw. Under experimenterande med programmet, har jag prövat med både tiff och jpeg som informat. Men en normal körning resulterar i princip alltid med att majoriteten av filerna inte kan komprimeras. Endast en liten minoritet av filerna, komprimeras verkligen. Detta gör mig bekymrad. Om jag har gjort något fundamentalt fel, varför funkar det då med några filer överhuvudtaget? Om det är GdiPlus som läser in filerna fel, då måste det vara ett sällsynt dåligt bibliotek som inte går att använda till någonting.
Här ett litet utsnitt av koden:
GdiplusStartupInput gdiplusStartupInput;
ULONG_PTR gdiplusToken;
// Starta gdi+
GdiplusStartup(&gdiplusToken, &gdiplusStartupInput, NULL);
wchar_t *pWideSrcFile = (wchar_t *)NCSMalloc(sizeof(wchar_t) * strlen(pSrcFile),true);
// Nollställ ovanstående sträng
memset(pWideSrcFile, 0, sizeof(wchar_t) * strlen(pSrcFile));
int nChars = strlen(pSrcFile);
#ifdef WIN32
MultiByteToWideChar(CP_ACP, 0, (LPSTR)pSrcFile, -1, (LPWSTR)pWideSrcFile, nChars);
#else
mbstowcs(pWideSrcFile, pSrcFile, nChars);
#endif
m_pSrc = NULL;
m_pSrc = Bitmap::FromFile(pWideSrcFile);
[b]// Trots att denna test faller väl ut, brukar filen för det mesta vara felavläst[/b]
if (m_pSrc == NULL)
{
MessageBox(0, pSrcFile, "Fel", 0);
return (NCS_FILE_OPEN_FAILED);
}
//NCSFileViewFileInfoEx has basic info about the file - dimensions, bands,
//georeferencing information etc.
NCSFileViewFileInfoEx *pDstInfo = (NCSFileViewFileInfoEx *)NCSMalloc(sizeof(NCSFileViewFileInfoEx), true);
NCSFileViewFileInfoEx DstInfo = *pDstInfo;
CNCSError Error;
[b]// Nedanstående värden är =0 när komprimeringen har gått fel. Alltså har felet med GDI+ att göra[/b]
DstInfo.nSizeX = m_pSrc->GetWidth();
DstInfo.nSizeY = m_pSrc->GetHeight();
Som synes, har jag skrivit kommentarer i koden om varför jag har dragit slutsatsen att det är GdiPlus som felar i det här fallet. Jag har även märkt en annan märklig sak, om jag debuggar programmet, blir det alltid fel. Men dubbelklickar jag på binären (oavsett om det är debug- eller release-binären), klarar det åtminstone en del bilder. Fortfarande kvarstår dock majoriteten av bilderna.
Jag använder Visual Studio 2003. Mina kunskaper om GdiPlus är i princip noll. Jag har valt det enbart för att det användes i ett exempel från Ecw SDK. Jag gissar att det kan vara något som måste ställas in hos GdiPlus, men har inte hittat någonting efter mycket googlande. Jag bifogar en zip-fil som innehåller den kompletta koden för den klass där jag använder GdiPlus.
