KImgIO
exr.cpp
Go to the documentation of this file.00001
00002
00013 #include "config.h"
00014
00015 #ifdef HAVE_EXR
00016
00017 #include <ImfRgbaFile.h>
00018 #include <ImfStandardAttributes.h>
00019 #include <ImathBox.h>
00020 #include <ImfInputFile.h>
00021 #include <ImfBoxAttribute.h>
00022 #include <ImfChannelListAttribute.h>
00023 #include <ImfCompressionAttribute.h>
00024 #include <ImfFloatAttribute.h>
00025 #include <ImfIntAttribute.h>
00026 #include <ImfLineOrderAttribute.h>
00027 #include <ImfStringAttribute.h>
00028 #include <ImfVecAttribute.h>
00029 #include <ImfArray.h>
00030 #include <ImfConvert.h>
00031
00032 #include <iostream>
00033
00034 #include <stdlib.h>
00035
00036 #include <kurl.h>
00037 #include <kprocess.h>
00038 #include <klocale.h>
00039 #include <kgenericfactory.h>
00040 #include <kdebug.h>
00041
00042 #include <qimage.h>
00043 #include <qcstring.h>
00044 #include <qfile.h>
00045 #include <qdatetime.h>
00046 #include <qdict.h>
00047 #include <qvalidator.h>
00048 #include <qcolor.h>
00049
00050 #include "exr.h"
00051
00052 using namespace Imf;
00053
00054
00055
00056
00057
00058 QRgb RgbaToQrgba(struct Rgba imagePixel)
00059 {
00060 float r,g,b,a;
00061
00062
00063
00064
00065
00066
00067
00068
00069
00070 r = imagePixel.r * 5.55555;
00071 g = imagePixel.g * 5.55555;
00072 b = imagePixel.b * 5.55555;
00073 a = imagePixel.a * 5.55555;
00074
00075
00076
00077
00078
00079
00080
00081
00082
00083
00084
00085
00086
00087
00088
00089
00090
00091
00092 if (r > 1.0)
00093 r = 1.0 + Imath::Math<float>::log ((r-1.0) * 0.184874 + 1) / 0.184874;
00094 if (g > 1.0)
00095 g = 1.0 + Imath::Math<float>::log ((g-1.0) * 0.184874 + 1) / 0.184874;
00096 if (b > 1.0)
00097 b = 1.0 + Imath::Math<float>::log ((b-1.0) * 0.184874 + 1) / 0.184874;
00098 if (a > 1.0)
00099 a = 1.0 + Imath::Math<float>::log ((a-1.0) * 0.184874 + 1) / 0.184874;
00100
00101
00102
00103 r = Imath::Math<float>::pow (r, 0.4545);
00104 g = Imath::Math<float>::pow (g, 0.4545);
00105 b = Imath::Math<float>::pow (b, 0.4545);
00106 a = Imath::Math<float>::pow (a, 0.4545);
00107
00108
00109
00110
00111
00112
00113 return qRgba( char (Imath::clamp ( r * 84.66f, 0.f, 255.f ) ),
00114 char (Imath::clamp ( g * 84.66f, 0.f, 255.f ) ),
00115 char (Imath::clamp ( b * 84.66f, 0.f, 255.f ) ),
00116 char (Imath::clamp ( a * 84.66f, 0.f, 255.f ) ) );
00117 }
00118
00119 KDE_EXPORT void kimgio_exr_read( QImageIO *io )
00120 {
00121 try
00122 {
00123 int width, height;
00124
00125
00126 RgbaInputFile file (QFile::encodeName(io->fileName()));
00127 Imath::Box2i dw = file.dataWindow();
00128
00129 width = dw.max.x - dw.min.x + 1;
00130 height = dw.max.y - dw.min.y + 1;
00131
00132 Array2D<Rgba> pixels;
00133 pixels.resizeErase (height, width);
00134
00135 file.setFrameBuffer (&pixels[0][0] - dw.min.x - dw.min.y * width, 1, width);
00136 file.readPixels (dw.min.y, dw.max.y);
00137
00138 QImage image(width, height, 32, 0, QImage::BigEndian);
00139 if( image.isNull())
00140 return;
00141
00142
00143 for ( int y=0; y < height; y++ ) {
00144 for ( int x=0; x < width; x++ ) {
00145
00146 image.setPixel( x, y, RgbaToQrgba( pixels[y][x] ) );
00147 }
00148 }
00149
00150 io->setImage( image );
00151 io->setStatus( 0 );
00152 }
00153 catch (const std::exception &exc)
00154 {
00155 kdDebug(399) << exc.what() << endl;
00156 return;
00157 }
00158 }
00159
00160
00161 KDE_EXPORT void kimgio_exr_write(QImageIO *)
00162 {
00163
00164 }
00165
00166
00167 #endif