Utility: Add JPEG image saver
This commit is contained in:
parent
054c74bded
commit
ee77899a6a
|
|
@ -49,6 +49,7 @@ Nazara Engine:
|
||||||
- It is now possible to initialize a StackArray with a size of zero on every platforms (this was not possible on non-Windows platforms before)
|
- It is now possible to initialize a StackArray with a size of zero on every platforms (this was not possible on non-Windows platforms before)
|
||||||
- Calling PlacementDestroy on a null pointer is now a no-op (was triggering an undefined behavior)
|
- Calling PlacementDestroy on a null pointer is now a no-op (was triggering an undefined behavior)
|
||||||
- Fix OBJParser relative offsets handling
|
- Fix OBJParser relative offsets handling
|
||||||
|
- Add JPEG image saver
|
||||||
|
|
||||||
Nazara Development Kit:
|
Nazara Development Kit:
|
||||||
- Added ImageWidget (#139)
|
- Added ImageWidget (#139)
|
||||||
|
|
|
||||||
|
|
@ -161,6 +161,38 @@ namespace Nz
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool SaveJPEG(const Image& image, const ImageParams& parameters, Stream& stream)
|
||||||
|
{
|
||||||
|
Image tempImage(image); //< We're using COW here to prevent Image copy unless required
|
||||||
|
|
||||||
|
int componentCount = ConvertToIntegerFormat(tempImage);
|
||||||
|
if (componentCount == 0)
|
||||||
|
{
|
||||||
|
NazaraError("Failed to convert image to suitable format");
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
long long imageQuality;
|
||||||
|
if (parameters.custom.GetIntegerParameter("NativeJPEGSaver_Quality", &imageQuality))
|
||||||
|
{
|
||||||
|
if (imageQuality <= 0 || imageQuality > 100)
|
||||||
|
{
|
||||||
|
NazaraError("NativeJPEGSaver_Quality value (" + Nz::String::Number(imageQuality) + ") does not fit in bounds ]0, 100], clamping...");
|
||||||
|
imageQuality = Nz::Clamp(imageQuality, 1LL, 100LL);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
imageQuality = 100;
|
||||||
|
|
||||||
|
if (!stbi_write_jpg_to_func(&WriteToStream, &stream, tempImage.GetWidth(), tempImage.GetHeight(), componentCount, tempImage.GetConstPixels(), int(imageQuality)))
|
||||||
|
{
|
||||||
|
NazaraError("Failed to write JPEG to stream");
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
bool SaveHDR(const Image& image, const ImageParams& parameters, Stream& stream)
|
bool SaveHDR(const Image& image, const ImageParams& parameters, Stream& stream)
|
||||||
{
|
{
|
||||||
NazaraUnused(parameters);
|
NazaraUnused(parameters);
|
||||||
|
|
@ -232,10 +264,12 @@ namespace Nz
|
||||||
{
|
{
|
||||||
void RegisterSTBSaver()
|
void RegisterSTBSaver()
|
||||||
{
|
{
|
||||||
s_formatHandlers["bmp"] = &SaveBMP;
|
s_formatHandlers["bmp"] = &SaveBMP;
|
||||||
s_formatHandlers["hdr"] = &SaveHDR;
|
s_formatHandlers["hdr"] = &SaveHDR;
|
||||||
s_formatHandlers["png"] = &SavePNG;
|
s_formatHandlers["jpg"] = &SaveJPEG;
|
||||||
s_formatHandlers["tga"] = &SaveTGA;
|
s_formatHandlers["jpeg"] = &SaveJPEG;
|
||||||
|
s_formatHandlers["png"] = &SavePNG;
|
||||||
|
s_formatHandlers["tga"] = &SaveTGA;
|
||||||
|
|
||||||
ImageSaver::RegisterSaver(FormatQuerier, SaveToStream);
|
ImageSaver::RegisterSaver(FormatQuerier, SaveToStream);
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue