Fix bug when saving color FITS/XISF files

This commit is contained in:
2024-03-24 23:55:50 +01:00
parent f35db9d1af
commit 4fe56acbd9
6 changed files with 70 additions and 11 deletions
+50 -8
View File
@@ -567,10 +567,12 @@ void writeFITSImage(fitsfile *fw, std::shared_ptr<RawImage> rawimage, ImageInfoD
fits_write_pix(fw, TFLOAT, firstpix, rawimage->size(), planes[i].data(), &status);
}
break;
default:
return;
}
for(const FITSRecord &record : imageinfo.fitsHeader)
{
if(skipKeys.contains(record.key))continue;
if(skipKeys.contains(record.key) || record.xisf)continue;
bool isdouble;
bool isint;
@@ -598,10 +600,7 @@ void ConvertRunable::run()
{
ImageInfoData imageinfo;
std::shared_ptr<RawImage> rawimage;
if(m_infile.endsWith(".FITS", Qt::CaseInsensitive) || m_infile.endsWith(".FIT", Qt::CaseInsensitive))
loadFITS(m_infile, imageinfo, rawimage);
if(m_infile.endsWith(".XISF", Qt::CaseInsensitive))
loadXISF(m_infile, imageinfo, rawimage);
loadImage(m_infile, imageinfo, rawimage);
if(rawimage)
{
@@ -620,11 +619,26 @@ void ConvertRunable::run()
default: return;
}
LibXISF::Image image(rawimage->width(), rawimage->height(), channelCount, sampleFormat, channelCount == 1 ? LibXISF::Image::Gray : LibXISF::Image::RGB, LibXISF::Image::Normal);
std::memcpy(image.imageData(), rawimage->data(), image.imageDataSize());
LibXISF::Image image(rawimage->width(), rawimage->height(), channelCount, sampleFormat, channelCount == 1 ? LibXISF::Image::Gray : LibXISF::Image::RGB, LibXISF::Image::Planar);
if(channelCount == 1)
{
std::memcpy(image.imageData(), rawimage->data(), image.imageDataSize());
}
else
{
size_t off = 0;
std::vector<RawImage> planes = rawimage->split();
for(const auto &plane : planes)
{
std::memcpy(image.imageData<uint8_t>() + off, plane.data(), plane.size() * RawImage::typeSize(plane.type()));
off += plane.size() * RawImage::typeSize(plane.type());
}
}
for(auto &record : imageinfo.fitsHeader)
{
if(record.value.type() == QVariant::Bool)
if(record.xisf)continue;
if(record.value.typeId() == QMetaType::Bool)
image.addFITSKeyword({record.key.toStdString(), record.value.toBool() ? "T" : "F", record.comment.toStdString()});
else
image.addFITSKeyword({record.key.toStdString(), record.value.toString().toStdString(), record.comment.toStdString()});
@@ -648,5 +662,33 @@ void ConvertRunable::run()
writeFITSImage(fw, rawimage, imageinfo);
fits_close_file(fw, &status);
}
if(m_format == "QIMAGE")
{
QImage::Format format = QImage::Format_Invalid;
int width = rawimage->widthBytes();
switch(rawimage->type())
{
case RawImage::UINT8:
if(rawimage->channels() == 1)format = QImage::Format_Grayscale8;
else if(rawimage->channels() == 3)format = QImage::Format_RGBX8888;
else if(rawimage->channels() == 4)format = QImage::Format_RGBA8888;
break;
case RawImage::UINT16:
if(rawimage->channels() == 1)format = QImage::Format_Grayscale16;
else if(rawimage->channels() == 3)format = QImage::Format_RGBX64;
else if(rawimage->channels() == 4)format = QImage::Format_RGBA64;
width *= 2;
break;
default:
return;
}
if(format == QImage::Format_Invalid)return;
QImage qimage(rawimage->width(), rawimage->height(), format);
for(uint32_t i=0; i < rawimage->height(); i++)
std::memcpy(qimage.scanLine(i), rawimage->data(i), width);
qimage.save(m_outfile);
}
}
}