OPJViewer opens now BMP, PNG, GIF, PNM, TIFF (with wxWidgets internals); added an encoder settings tab, for future integration with "save file as..." in JPEG 2000 format
This commit is contained in:
@@ -89,30 +89,43 @@ void jp2_error_callback(const char *msg, void *client_data) {
|
||||
int message_len = strlen(msg) - 1;
|
||||
if (msg[message_len] != '\n')
|
||||
message_len = MAX_MESSAGE_LEN;
|
||||
wxMutexGuiEnter();
|
||||
#ifndef __WXGTK__
|
||||
wxMutexGuiEnter();
|
||||
#endif /* __WXGTK__ */
|
||||
wxLogMessage(wxT("[ERROR] %.*s"), message_len, msg);
|
||||
#ifndef __WXGTK__
|
||||
wxMutexGuiLeave();
|
||||
#endif /* __WXGTK__ */
|
||||
}
|
||||
|
||||
/* sample warning callback expecting a FILE* client object */
|
||||
void jp2_warning_callback(const char *msg, void *client_data) {
|
||||
int message_len = strlen(msg) - 1;
|
||||
if (msg[message_len] != '\n')
|
||||
message_len = MAX_MESSAGE_LEN;
|
||||
wxMutexGuiEnter();
|
||||
#ifndef __WXGTK__
|
||||
wxMutexGuiEnter();
|
||||
#endif /* __WXGTK__ */
|
||||
wxLogMessage(wxT("[WARNING] %.*s"), message_len, msg);
|
||||
#ifndef __WXGTK__
|
||||
wxMutexGuiLeave();
|
||||
#endif /* __WXGTK__ */
|
||||
}
|
||||
|
||||
/* sample debug callback expecting no client object */
|
||||
void jp2_info_callback(const char *msg, void *client_data) {
|
||||
int message_len = strlen(msg) - 1;
|
||||
if (msg[message_len] != '\n')
|
||||
message_len = MAX_MESSAGE_LEN;
|
||||
wxMutexGuiEnter();
|
||||
#ifndef __WXGTK__
|
||||
wxMutexGuiEnter();
|
||||
#endif /* __WXGTK__ */
|
||||
wxLogMessage(wxT("[INFO] %.*s"), message_len, msg);
|
||||
#ifndef __WXGTK__
|
||||
wxMutexGuiLeave();
|
||||
#endif /* __WXGTK__ */
|
||||
}
|
||||
|
||||
|
||||
// load the jp2 file format
|
||||
bool wxJP2Handler::LoadFile(wxImage *image, wxInputStream& stream, bool verbose, int index)
|
||||
{
|
||||
@@ -182,9 +195,13 @@ bool wxJP2Handler::LoadFile(wxImage *image, wxInputStream& stream, bool verbose,
|
||||
/* decode the stream and fill the image structure */
|
||||
opjimage = opj_decode(dinfo, cio);
|
||||
if (!opjimage) {
|
||||
#ifndef __WXGTK__
|
||||
wxMutexGuiEnter();
|
||||
#endif /* __WXGTK__ */
|
||||
wxLogError(wxT("JP2: failed to decode image!"));
|
||||
#ifndef __WXGTK__
|
||||
wxMutexGuiLeave();
|
||||
#endif /* __WXGTK__ */
|
||||
opj_destroy_decompress(dinfo);
|
||||
opj_cio_close(cio);
|
||||
free(src);
|
||||
@@ -194,59 +211,16 @@ bool wxJP2Handler::LoadFile(wxImage *image, wxInputStream& stream, bool verbose,
|
||||
/* close the byte stream */
|
||||
opj_cio_close(cio);
|
||||
|
||||
// check image size
|
||||
if ((opjimage->numcomps != 1) && (opjimage->numcomps != 3)) {
|
||||
/* common rendering method */
|
||||
#include "imagjpeg2000.cpp"
|
||||
|
||||
#ifndef __WXGTK__
|
||||
wxMutexGuiEnter();
|
||||
wxLogError(wxT("JP2: weird number of components"));
|
||||
wxMutexGuiLeave();
|
||||
opj_destroy_decompress(dinfo);
|
||||
free(src);
|
||||
return false;
|
||||
}
|
||||
|
||||
|
||||
// prepare image size
|
||||
image->Create(opjimage->comps[0].w, opjimage->comps[0].h, true );
|
||||
|
||||
// access image raw data
|
||||
image->SetMask( false );
|
||||
ptr = image->GetData();
|
||||
|
||||
// RGB color picture
|
||||
if (opjimage->numcomps == 3) {
|
||||
int row, col;
|
||||
int *r = opjimage->comps[0].data;
|
||||
int *g = opjimage->comps[1].data;
|
||||
int *b = opjimage->comps[2].data;
|
||||
for (row = 0; row < opjimage->comps[0].h; row++) {
|
||||
for (col = 0; col < opjimage->comps[0].w; col++) {
|
||||
|
||||
*(ptr++) = *(r++);
|
||||
*(ptr++) = *(g++);
|
||||
*(ptr++) = *(b++);
|
||||
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// B/W picture
|
||||
if (opjimage->numcomps == 1) {
|
||||
int row, col;
|
||||
int *y = opjimage->comps[0].data;
|
||||
for (row = 0; row < opjimage->comps[0].h; row++) {
|
||||
for (col = 0; col < opjimage->comps[0].w; col++) {
|
||||
|
||||
*(ptr++) = *(y);
|
||||
*(ptr++) = *(y);
|
||||
*(ptr++) = *(y++);
|
||||
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
wxMutexGuiEnter();
|
||||
#endif /* __WXGTK__ */
|
||||
wxLogMessage(wxT("JP2: image loaded."));
|
||||
wxMutexGuiLeave();
|
||||
#ifndef __WXGTK__
|
||||
wxMutexGuiLeave();
|
||||
#endif /* __WXGTK__ */
|
||||
|
||||
/* close openjpeg structs */
|
||||
opj_destroy_decompress(dinfo);
|
||||
@@ -263,7 +237,14 @@ bool wxJP2Handler::LoadFile(wxImage *image, wxInputStream& stream, bool verbose,
|
||||
// save the jp2 file format
|
||||
bool wxJP2Handler::SaveFile( wxImage *image, wxOutputStream& stream, bool verbose )
|
||||
{
|
||||
#ifndef __WXGTK__
|
||||
wxMutexGuiEnter();
|
||||
#endif /* __WXGTK__ */
|
||||
wxLogError(wxT("JP2: Couldn't save image -> not implemented."));
|
||||
#ifndef __WXGTK__
|
||||
wxMutexGuiLeave();
|
||||
#endif /* __WXGTK__ */
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
|
Reference in New Issue
Block a user