Summary: | No thumbnails for RAW files (Epson R-D1, supported in dcraw) | ||
---|---|---|---|
Product: | [Applications] kphotoalbum | Reporter: | Cesar Crusius <cesar.crusius> |
Component: | Backend | Assignee: | KPhotoAlbum Bugs <kpabugs> |
Status: | RESOLVED FIXED | ||
Severity: | normal | ||
Priority: | NOR | ||
Version: | unspecified | ||
Target Milestone: | --- | ||
Platform: | unspecified | ||
OS: | Linux | ||
Latest Commit: | Version Fixed In: | ||
Attachments: | ImageManager-recognize-erf.patch |
Description
Cesar Crusius
2007-02-18 19:10:22 UTC
Can you provide a sample image file or two? The files are too big for creating an attachment to the bug (~9M). Anywhere else I can put them? You can try to use any service listed at http://www.rapget.com/en/ . When you upload the file, please mail the URL to me (jkt@gentoo.org) and I'll post the files somewhere where people can easily download them. File is available at http://dev.gentoo.org/~jkt/tmp/kde-bug-141877-digital00092-eps2029.erf and KPA indeed doesn't recognize it. Created attachment 20533 [details]
ImageManager-recognize-erf.patch
Trivial patch that allows KPA to at least *see* the file. It still loads only a
thumbnail from it for me, but that's a separate problem.
SVN commit 666157 by jkt: CCBUG: 141877 Recognize Epson R-D1 RAW format (.erf). Still no real support for it besides viewing thumbnails, though... M +1 -0 RawImageDecoder.cpp --- trunk/extragear/graphics/kphotoalbum/ImageManager/RawImageDecoder.cpp #666156:666157 @@ -70,6 +70,7 @@ QString::fromLatin1("raf"), QString::fromLatin1("rdc"), QString::fromLatin1("x3f"), + QString::fromLatin1("erf"), QString::null }; if (Settings::SettingsData::instance()->dontReadRawFilesWithOtherMatchingFile()) { static const QString standardExtensions[] = { SVN commit 701359 by jkt: FEATURE: Use libkdcraw for RAW image processing instead of a bundled and outdated dcraw copy. Epson R-D1 RAW format (.erf) should be supported better... BUG: 130781 CCBUG: 141877 BUG: 145941 M +4 -0 ChangeLog M +8 -3 ImageManager/ImageLoader.cpp M +1 -2 ImageManager/Makefile.am M +9 -22 ImageManager/RawImageDecoder.cpp D ImageManager/parse.c M +1 -1 Makefile.am M +17 -0 configure.in.in --- branches/extragear/kde3/graphics/kphotoalbum/ChangeLog #701358:701359 @@ -1,3 +1,7 @@ +2007-08-18 Jan Kundrat <jkt@gentoo.org> + + * Use libkdcraw intead of budled and rotten dcraw copy + 2007-08-11 Jan Kundrat <jkt@gentoo.org> * Automatically hide mouse cursor and disable screensaver when in Viewer --- branches/extragear/kde3/graphics/kphotoalbum/ImageManager/ImageLoader.cpp #701358:701359 @@ -137,15 +137,20 @@ } else { - ok = img.load( request->fileName() ); + // At first, we have to give our RAW decoders a try. If we allowed + // QImage's load() method, it'd for example load a tiny thumbnail from + // NEF files, which is not what we want. + ok = ImageDecoder::decode( &img, request->fileName(), &fullSize, dim); if (ok) request->setFullSize( img.size() ); } + if (!ok) { - // Still didn't work, try with our own decoders - ok = ImageDecoder::decode( &img, request->fileName(), &fullSize, dim); + // Now we can try QImage's stuff as a fallback... + ok = img.load( request->fileName() ); if (ok) request->setFullSize( img.size() ); + } return img; --- branches/extragear/kde3/graphics/kphotoalbum/ImageManager/Makefile.am #701358:701359 @@ -3,8 +3,7 @@ INCLUDES = -I$(srcdir)/.. $(all_includes) libImageManager_la_SOURCES = ImageLoader.cpp Manager.cpp ImageRequest.cpp ImageClient.cpp \ - ImageDecoder.cpp RawImageDecoder.cpp parse.c VideoManager.cpp \ - RequestQueue.cpp + ImageDecoder.cpp RawImageDecoder.cpp VideoManager.cpp RequestQueue.cpp KDE_CXXFLAGS = $(USE_EXCEPTIONS) $(USE_THREADS) -DQT_NO_CAST_ASCII -DQT_CAST_NO_ASCII --- branches/extragear/kde3/graphics/kphotoalbum/ImageManager/RawImageDecoder.cpp #701358:701359 @@ -23,36 +23,23 @@ #include <qwmatrix.h> #include <qstringlist.h> #include "Settings/SettingsData.h" +#include <libkdcraw/kdcraw.h> -/* Main entry point into raw parser */ -extern "C" { - int extract_thumbnail( FILE*, FILE*, int* ); -} - namespace ImageManager { bool RAWImageDecoder::_decode( QImage *img, const QString& imageFile, QSize* fullSize, int dim) { - /* width and height seem to be only hints, ignore */ - Q_UNUSED( dim ); - /* Open file and extract thumbnail */ - FILE* input = fopen( QFile::encodeName(imageFile), "rb" ); - if( !input ) return false; - KTempFile output; - output.setAutoDelete(true); - int orientation = 0; - if( extract_thumbnail( input, output.fstream(), &orientation ) ) { - fclose(input); - return false; - } - fclose(input); - output.close(); - if( !img->load( output.name() ) ) return false; + /* width and height seem to be only hints, ignore */ + Q_UNUSED( dim ); - if( fullSize ) *fullSize = img->size(); + if ( !KDcrawIface::KDcraw::loadDcrawPreview( *img, imageFile ) ) + return false; - return true; + if ( fullSize ) + *fullSize = img->size(); + + return true; } QStringList RAWImageDecoder::_rawExtensions; --- branches/extragear/kde3/graphics/kphotoalbum/Makefile.am #701358:701359 @@ -34,7 +34,7 @@ CategoryListView/libCategoryListView.la \ $(LIBKPHOTOALBUM_SQLDB) $(LIB_KIO) -ljpeg $(KPHOTOALBUM_KIPI_LIBS) $(KPHOTOALBUM_KEXI_LIBS) \ $(LIBKPHOTOALBUM_KEXIDB) HTMLGenerator/libHTMLGenerator.la\ - $(KPHOTOALBUM_EXIV2_LIBS) -lkmediaplayer + $(KPHOTOALBUM_EXIV2_LIBS) -lkmediaplayer -lkdcraw METASOURCES = AUTO KDE_CXXFLAGS = $(USE_EXCEPTIONS) $(USE_THREADS) -DQT_NO_CAST_ASCII -DQT_CAST_NO_ASCII --- branches/extragear/kde3/graphics/kphotoalbum/configure.in.in #701358:701359 @@ -75,7 +75,24 @@ fi +# -------------------------------------------------- kdcraw Check +if test "$PKGCONFIGFOUND" = "yes" ; then + have_libkdcraw=no + KDE_PKG_CHECK_MODULES(LIBKDCRAW, libkdcraw >= 0.1.1, + have_libkdcraw=yes, have_libkdcraw=no) + + if test "x$have_libkdcraw" = "xno"; then + AC_MSG_RESULT([no]) + AC_MSG_ERROR([Can't find the libkdcraw library]); + else + AC_MSG_RESULT([yes]) + fi +else + AC_MSG_ERROR([Can't find the libkdcraw library]); +fi + + # -------------------------------------------------- KexiDB Check #KDE_CHECK_HEADER(kexidb/connection.h, have_kexidb=yes, have_kexidb=no) SVN commit 701490 by jkt: Decode RAW data if the embedded thumbnail's dimensions are less than 80% of the real image size BUG: 141877 M +35 -0 RawImageDecoder.cpp --- branches/extragear/kde3/graphics/kphotoalbum/ImageManager/RawImageDecoder.cpp #701489:701490 @@ -24,6 +24,7 @@ #include <qstringlist.h> #include "Settings/SettingsData.h" #include <libkdcraw/kdcraw.h> +#include <kdebug.h> namespace ImageManager { @@ -36,6 +37,40 @@ if ( !KDcrawIface::KDcraw::loadDcrawPreview( *img, imageFile ) ) return false; + KDcrawIface::DcrawInfoContainer metadata; + + if ( !KDcrawIface::KDcraw::rawFileIdentify( metadata, imageFile ) || + ( img->width() < metadata.imageSize.width() * 0.8 ) || + ( img->height() < metadata.imageSize.height() * 0.8 ) ) { + + // let's try to get a better resolution + KDcrawIface::KDcraw decoder; + KDcrawIface::RawDecodingSettings rawDecodingSettings; + + if ( rawDecodingSettings.sixteenBitsImage ) { + kdDebug() << "16 bits per color channel is not supported yet" << endl; + return false; + } else { + QByteArray imageData; /* 3 bytes for each pixel, */ + int width, height, rgbmax; + if ( !decoder.decodeRAWImage( imageFile, rawDecodingSettings, imageData, width, height, rgbmax ) ) + return false; + + // Now the funny part, how to turn this fugly QByteArray into an QImage. Yay! + if ( !img->create( width, height, 32 ) ) + return false; + + uchar* data = img->bits(); + + for ( uint i = 0; i < imageData.size(); i += 3, data += 4 ) { + data[0] = imageData[i + 2]; // blue + data[1] = imageData[i + 1]; // green + data[2] = imageData[i]; // red + data[3] = 0xff; // alpha + } + } + } + if ( fullSize ) *fullSize = img->size(); |