Compare commits
2 Commits
96a89bff92
...
d0dbef20c7
| Author | SHA1 | Date | |
|---|---|---|---|
| d0dbef20c7 | |||
| bd45900821 |
+2
-2
@@ -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
@@ -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
@@ -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;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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);
|
||||||
|
|||||||
+8
-1
@@ -27,6 +27,12 @@ public:
|
|||||||
b16 |= sign;
|
b16 |= sign;
|
||||||
b16 |= mantisa;
|
b16 |= mantisa;
|
||||||
}
|
}
|
||||||
|
else if(exp == 255)//inf or nan
|
||||||
|
{
|
||||||
|
b16 = 0x7c00;
|
||||||
|
b16 |= sign;
|
||||||
|
b16 |= mantisa;
|
||||||
|
}
|
||||||
else if(exp > 142)
|
else if(exp > 142)
|
||||||
{
|
{
|
||||||
b16 = 0x7c00;// inf
|
b16 = 0x7c00;// inf
|
||||||
@@ -51,7 +57,8 @@ public:
|
|||||||
if(b16)
|
if(b16)
|
||||||
{
|
{
|
||||||
i |= sign << 16;
|
i |= sign << 16;
|
||||||
i |= (exp + 112) << 23;
|
if(exp==31)i |= 0x7f800000;
|
||||||
|
else i |= (exp + 112) << 23;
|
||||||
i |= (b16 & 0x3ff) << 13;
|
i |= (b16 & 0x3ff) << 13;
|
||||||
}
|
}
|
||||||
return *reinterpret_cast<float*>(&i);
|
return *reinterpret_cast<float*>(&i);
|
||||||
|
|||||||
@@ -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
@@ -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;
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user