Finish standalone thumbnailer under

This commit is contained in:
2025-03-10 11:01:45 +01:00
parent 96a89bff92
commit bd45900821
6 changed files with 38 additions and 22 deletions
+2 -2
View File
@@ -392,9 +392,9 @@ void swPaint(std::shared_ptr<RawImage> &rawImage, float dx, float dy, float scal
float iptr; float iptr;
float fy = std::modf((y + oy) * iscale, &iptr); float fy = std::modf((y + oy) * iscale, &iptr);
int64_t py = iptr; int64_t py = iptr;
int64_t w = py * rawImage->widthBytes(); int64_t w = py * rawImage->widthSamples();
int64_t w2 = w; int64_t w2 = w;
if(py+1 < imgHeight)w2 += rawImage->widthBytes(); if(py+1 < imgHeight)w2 += rawImage->widthSamples();
if(py >= imgHeight)break; if(py >= imgHeight)break;
for(int64_t x = std::max((int64_t)0, -ox); x < width; x++) for(int64_t x = std::max((int64_t)0, -ox); x < width; x++)
+1 -6
View File
@@ -293,7 +293,6 @@ void ConvertRunable::run()
// if nothing else try QImage // if nothing else try QImage
{ {
QImage::Format format = QImage::Format_Invalid; QImage::Format format = QImage::Format_Invalid;
int width = rawimage->widthBytes();
switch(rawimage->type()) switch(rawimage->type())
{ {
@@ -306,7 +305,6 @@ void ConvertRunable::run()
if(rawimage->channels() == 1)format = QImage::Format_Grayscale16; if(rawimage->channels() == 1)format = QImage::Format_Grayscale16;
else if(rawimage->channels() == 3)format = QImage::Format_RGBX64; else if(rawimage->channels() == 3)format = QImage::Format_RGBX64;
else if(rawimage->channels() == 4)format = QImage::Format_RGBA64; else if(rawimage->channels() == 4)format = QImage::Format_RGBA64;
width *= 2;
break; break;
case RawImage::FLOAT16: case RawImage::FLOAT16:
case RawImage::FLOAT32: case RawImage::FLOAT32:
@@ -316,15 +314,12 @@ void ConvertRunable::run()
if(rawimage->channels() == 1)format = QImage::Format_Grayscale16; if(rawimage->channels() == 1)format = QImage::Format_Grayscale16;
else if(rawimage->channels() == 3)format = QImage::Format_RGBX64; else if(rawimage->channels() == 3)format = QImage::Format_RGBX64;
else if(rawimage->channels() == 4)format = QImage::Format_RGBA64; else if(rawimage->channels() == 4)format = QImage::Format_RGBA64;
width *= 2;
break; break;
} }
if(format == QImage::Format_Invalid)return; if(format == QImage::Format_Invalid)return;
QImage qimage(rawimage->width(), rawimage->height(), format); QImage qimage((const uchar*)rawimage->data(), rawimage->width(), rawimage->height(), rawimage->widthBytes(), format);
for(uint32_t i=0; i < rawimage->height(); i++)
std::memcpy(qimage.scanLine(i), rawimage->data(i), width);
qimage.save(m_outfile); qimage.save(m_outfile);
} }
} }
+9 -3
View File
@@ -198,7 +198,7 @@ void calcStats(const T *data, size_t n, size_t w, RawImage::Stats &stats)
auto findMedian = [histSize](std::vector<uint32_t> &histogram, size_t n) -> size_t auto findMedian = [histSize](std::vector<uint32_t> &histogram, size_t n) -> size_t
{ {
size_t histSum = 0; size_t histSum = 0;
for(size_t o=0; o < histSize; o++) for(size_t o=1; o < histSize; o++)
{ {
histSum += histogram[o]; histSum += histogram[o];
if(histSum >= n/2) if(histSum >= n/2)
@@ -299,7 +299,8 @@ void calcStats(const T *data, size_t n, size_t w, RawImage::Stats &stats)
double sum2 = (double)sum[i] * sum[i]; double sum2 = (double)sum[i] * sum[i];
stats.m_stdDev[i] = std::sqrt((sumSq[i] - sum2 / na[i]) / (na[i] - 1)); stats.m_stdDev[i] = std::sqrt((sumSq[i] - sum2 / na[i]) / (na[i] - 1));
uint32_t median = findMedian(histogram[i], na[i]); size_t naclip = na[i] - histogram[i][0];
uint32_t median = findMedian(histogram[i], naclip);
stats.m_median[i] = median; stats.m_median[i] = median;
std::vector<uint32_t> madHist(histSize, 0); std::vector<uint32_t> madHist(histSize, 0);
madHist[0] = histogram[i][median]; madHist[0] = histogram[i][median];
@@ -308,7 +309,7 @@ void calcStats(const T *data, size_t n, size_t w, RawImage::Stats &stats)
if(median + o < histSize)madHist[o] += histogram[i][median + o]; if(median + o < histSize)madHist[o] += histogram[i][median + o];
if(o <= median)madHist[o] += histogram[i][median - o]; if(o <= median)madHist[o] += histogram[i][median - o];
} }
stats.m_mad[i] = findMedian(madHist, na[i]); stats.m_mad[i] = findMedian(madHist, naclip);
if constexpr(!std::numeric_limits<T>::is_integer) if constexpr(!std::numeric_limits<T>::is_integer)
{ {
stats.m_median[i] /= 65535.0; stats.m_median[i] /= 65535.0;
@@ -403,6 +404,11 @@ uint32_t RawImage::norm() const
} }
uint32_t RawImage::widthBytes() const uint32_t RawImage::widthBytes() const
{
return m_ch * m_width * typeSize(m_type);
}
uint32_t RawImage::widthSamples() const
{ {
return m_ch * m_width; return m_ch * m_width;
} }
+1
View File
@@ -98,6 +98,7 @@ public:
DataType type() const; DataType type() const;
uint32_t norm() const; uint32_t norm() const;
uint32_t widthBytes() const; uint32_t widthBytes() const;
uint32_t widthSamples() const;
void* data(); void* data();
const void* data() const; const void* data() const;
void* data(uint32_t row, uint32_t col = 0); void* data(uint32_t row, uint32_t col = 0);
+1 -1
View File
@@ -17,9 +17,9 @@ if(BUILD_THUMBNAILER)
else(WIN32) else(WIN32)
qt_add_executable(tenmonthumbnailer qt_add_executable(tenmonthumbnailer
main.cpp main.cpp
../loadimage.cpp
../rawimage.cpp ../rawimage.cpp
../rawimage_sse.cpp ../rawimage_sse.cpp
../loadimage.cpp
../imageinfodata.cpp) ../imageinfodata.cpp)
target_link_libraries(tenmonthumbnailer PRIVATE Qt6::Core Qt6::Gui ${EXIF_LIB} ${FITS_LIB} ${RAW_LIB} ${WCS_LIB} ${LCMS2_LIB} XISF) target_link_libraries(tenmonthumbnailer PRIVATE Qt6::Core Qt6::Gui ${EXIF_LIB} ${FITS_LIB} ${RAW_LIB} ${WCS_LIB} ${LCMS2_LIB} XISF)
+24 -10
View File
@@ -28,21 +28,35 @@ int main(int argc, char *argv[])
ImageInfoData info; ImageInfoData info;
std::shared_ptr<RawImage> rawImage; std::shared_ptr<RawImage> rawImage;
if(!loadImage(input, info, rawImage)) if(!loadImage(input, info, rawImage))
return 1;
if(!rawImage)
return 2; return 2;
if(!rawImage)
return 3;
bool ok;
int size = parser.value("s").toInt(&ok);
if(!ok)
size = 128;
QSize rect(rawImage->width(), rawImage->height());
rect.scale(size, size, Qt::KeepAspectRatio);
rawImage->calcStats();
rawImage->resize(rect.width(), rect.height());
if(rawImage->imageStats().m_median[0] < rawImage->norm() * 0.2f)
{
MTFParam mtfParams = rawImage->calcMTFParams(true);
rawImage->applySTF(mtfParams);
}
rawImage->convertToType(RawImage::UINT8); rawImage->convertToType(RawImage::UINT8);
QImage img((const uchar*)rawImage->data(), rawImage->width(), rawImage->height(), QImage::Format_RGBA8888); QImage img;
bool ok = false; if(rawImage->channels() == 1)
int size = parser.value("s").toInt(&ok); img = QImage((const uchar*)rawImage->data(), rawImage->width(), rawImage->height(), rawImage->widthBytes(), QImage::Format_Grayscale8);
if(!ok)size = 128; else
img = img.scaled(size, size, Qt::KeepAspectRatio); img = QImage((const uchar*)rawImage->data(), rawImage->width(), rawImage->height(), rawImage->widthBytes(), QImage::Format_RGBA8888);
img.save(output, "png");
//rawImage->convertTosRGB(); if(!img.save(output, "png"))
return 4;
return 0; return 0;
} }