diff --git a/CMakeLists.txt b/CMakeLists.txt index 9330805..2b14767 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -37,6 +37,15 @@ set(CMAKE_AUTORCC ON) find_package(Qt5 5.6 REQUIRED Core Widgets) +message(STATUS "QT_DEFINITIONS: ${QT_DEFINITIONS}") + +set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fPIC ") + +include_directories(/usr/include/x86_64-linux-gnu/qt5/QtCore) +include_directories(/usr/include/x86_64-linux-gnu/qt5/QtGui) +include_directories(/usr/include/x86_64-linux-gnu/qt5) + + #include(${QT_USE_FILE}) add_definitions(${QT_DEFINITIONS}) @@ -274,7 +283,7 @@ else() ) endif() -target_link_libraries(hdrmerge ${STRIP} ${hdrmerge_libs} Qt5::Widgets) + if(WIN32) # Compile a target without GUI, for the .com executable @@ -354,3 +363,30 @@ if(Boost_FOUND) add_subdirectory(test) endif() +add_executable(tiff2dng tiff2dng.cpp) + +find_package(OpenCV REQUIRED) + +include_directories(${OpenCV_INCLUDE_DIRS}) + +find_package(ZLIB REQUIRED) + +include_directories(${ZLIB_INCLUDE_DIRS}) + +add_library(hdrmerge_lib + ${hdrmerge_sources} + ) + +target_link_libraries(hdrmerge_lib + ${hdrmerge_libs} Qt5::Widgets Qt5::Core + ) + +target_link_libraries(tiff2dng + Qt5::Widgets + ${hdrmerge_libs} + ${OpenCV_LIBS} + hdrmerge_lib + ${ZLIB_LIBRARIES} + ) + +target_link_libraries(hdrmerge ${STRIP} ${hdrmerge_libs} Qt5::Widgets) diff --git a/src/CFAPattern.hpp b/src/CFAPattern.hpp index ab36510..7d8c970 100644 --- a/src/CFAPattern.hpp +++ b/src/CFAPattern.hpp @@ -41,6 +41,13 @@ class CFAPattern { } } + void setPattern(uint32_t f) { + filters = f; + if (filters == 9) { + throw std::runtime_error("need fcol function for Fujifilm X-Trans sensor"); + } + } + bool operator==(const CFAPattern & r) const { return filters == r.filters; } diff --git a/tiff2dng.cpp b/tiff2dng.cpp new file mode 100644 index 0000000..75f8291 --- /dev/null +++ b/tiff2dng.cpp @@ -0,0 +1,75 @@ +#include + +#include "src/DngFloatWriter.hpp" +#include "src/ImageIO.hpp" +#include +#include + + +void convert(std::string filename) { + std::cout << "reading input file " << filename << std::endl; + cv::Mat_ im = cv::imread(filename, cv::IMREAD_UNCHANGED); + double minval = 0; + double maxval = 0; + cv::minMaxIdx(im, &minval, &maxval); + im *= 65535.0/maxval; + int const width = im.cols; + int const height = im.rows; + std::cout << "size: " << im.size() << std::endl; + hdrmerge::Array2D arr(width, height); + std::cout << "hdrmerge::Array2D size: " << arr.size() << std::endl; + for (int yy = 0; yy < height; ++yy) { + for (int xx = 0; xx < width; ++xx) { + arr(xx, yy) = double(im(yy, xx)); + } + } + cv::Mat preview; + cv::cvtColor(im, preview, cv::COLOR_BayerBG2BGR); + preview.convertTo(preview, CV_8UC3, 1.0/256); + cv::resize(preview, preview, cv::Size(), .5, .5); + //cv::imwrite(filename + "-preview.tif", preview); + cv::cvtColor(preview, preview, cv::COLOR_BGR2RGB); + hdrmerge::RawParameters params((filename + ".dng").c_str()); + params.height = params.rawHeight = height; + params.width = params.rawWidth = width; + params.fileName = filename.c_str(); + params.isoSpeed = 100; + params.shutter = .1; + params.aperture = 2.8; + params.colors = 3; + params.black = 0; + params.flip = 0; + switch (params.flip) { + case 0: params.tiffOrientation = 1; break; // 0° + case 3: params.tiffOrientation = 3; break; // 180° + case 5: params.tiffOrientation = 8; break; // + case 6: params.tiffOrientation = 6; break; // 270° + default: params.tiffOrientation = 9; break; // 90° + } + + + //QImage q_preview = hdrmerge::ImageIO::renderPreview(arr, params, 1.0); + QImage q_preview = QImage(preview.data, preview.size().width, preview.size().height, QImage::Format_RGB888); + std::cout << "q_preview width / height: " << q_preview.width() << " / " << q_preview.height() << std::endl; + hdrmerge::DngFloatWriter writer; + writer.setBitsPerSample(16); + writer.setPreviewWidth(q_preview.width()); + writer.setPreview(q_preview); + + + params.FC.setPattern(3031741620); + + std::cout << "Writing result" << std::endl; + writer.write(std::move(arr), params, (filename + ".dng").c_str()); + std::cout << "done." << std::endl; +} + +int main(int argc, char ** argv) { + if (argc < 2) { + std::cout << "Usage: " << argv[0] << " input files..." << std::endl; + } + + for (int ii = 1; ii < argc; ++ii) { + convert(argv[ii]); + } +}