13#include "enrollment/Export.h"
33 using inno_AllocateData = uint8_t* (*)(
void*,
size_t);
34 INNO_ENROLLMENT_API
void inno_ImageEncoder_Encode(
const uint8_t* raw,
35 unsigned int rawHeight,
36 unsigned int rawWidth,
42 inno_AllocateData allocator,
44 ErrorCallbacks errorCallbacks);
45 INNO_ENROLLMENT_API
int inno_ImageEncoder_GetPngCompressionLevelId();
46 INNO_ENROLLMENT_API
size_t inno_ImageEncoder_GetRawLength(
unsigned int rawHeight,
47 unsigned int rawWidth,
48 unsigned char channels);
49 INNO_ENROLLMENT_API
void inno_ImageEncoder_EncodeRaw(uint8_t* storage,
50 unsigned int rawHeight,
51 unsigned int rawWidth,
57 INNO_ENROLLMENT_API
int inno_ImageEncoder_GeJpgQualityId();
58 INNO_ENROLLMENT_API
int inno_ImageEncoder_GeJpgProgressiveId();
59 INNO_ENROLLMENT_API
int inno_ImageEncoder_GeJpgOptimizedId();
60 INNO_ENROLLMENT_API
int inno_ImageEncoder_GetTiffCompressionId();
61 INNO_ENROLLMENT_API
int inno_ImageEncoder_GetTiffUnitId();
62 INNO_ENROLLMENT_API
int inno_ImageEncoder_GetTiffXDpiId();
63 INNO_ENROLLMENT_API
int inno_ImageEncoder_GetTiffYDpiId();
64 INNO_ENROLLMENT_API
int inno_ImageEncoder_GeWebpQualityId();
65 INNO_ENROLLMENT_API
int inno_ImageEncoder_GetJpg2000CompressionRateId();
68 class BmpImageEncoder;
69 class PngImageEncoder;
70 class TiffImageEncoder;
71 class JpgImageEncoder;
72 class Jp2ImageEncoder;
73 class WsqImageEncoder;
74 class IRawImageEncoder;
75 class WebpImageEncoder;
81 class ImageEncoderVisitor
93 ImageEncoderVisitor() =
default;
94 virtual ~ImageEncoderVisitor() =
default;
95 ImageEncoderVisitor(
const ImageEncoderVisitor&) =
delete;
96 ImageEncoderVisitor(ImageEncoderVisitor&&) =
delete;
97 ImageEncoderVisitor& operator=(
const ImageEncoderVisitor&) =
delete;
98 ImageEncoderVisitor& operator=(ImageEncoderVisitor&&) =
delete;
114 [[nodiscard]]
virtual std::vector<uint8_t>
Encode(
const RawImage& raw)
const = 0;
130 ImageEncoder() =
default;
131 ImageEncoder(
const ImageEncoder&) =
delete;
132 ImageEncoder(ImageEncoder&&) =
delete;
133 ImageEncoder& operator=(
const ImageEncoder&) =
delete;
134 ImageEncoder& operator=(ImageEncoder&&) =
delete;
135 virtual ~ImageEncoder() =
default;
143 class SupportedImageEncoder :
public ImageEncoder
155 if (raw.height == 0 || raw.width == 0 || raw.Data().empty())
160 std::vector<uint8_t> encodedImage;
161 auto opt = ComposeOptions(raw);
163 inno_ImageEncoder_Encode(raw.Data().data(),
166 static_cast<unsigned int>(raw.dpi),
167 static_cast<uint8_t
>(raw.type),
171 &SupportedImageEncoder::AllocateData,
191 void SetOption(
int key,
int value)
193 const std::scoped_lock lock(mux);
194 options[key] = value;
199 std::map<int, int> options;
200 mutable std::mutex mux;
202 using AllocFunc = uint8_t* (*)(
void*, std::size_t);
203 static uint8_t* AllocateData(
void* container,
const size_t length)
205 std::vector<uint8_t>& vec = *
static_cast<std::vector<uint8_t>*
>(container);
210 virtual void AddOptionsForImageAttributes(
const RawImage& ,
211 const std::function<
void(
int,
int)>& )
const
215 std::vector<int> ComposeOptions(
const RawImage& image)
const
218 o.reserve(options.size() * 2);
221 const std::scoped_lock lock(mux);
222 for (
auto const& [key, val] : options)
229 AddOptionsForImageAttributes(image,
230 [&](
int key,
int val)
256 visitor.Visit(*
this);
292 static const int MinLevel = 0;
293 static const int MaxLevel = 9;
294 if (level < MinLevel || level > MaxLevel)
299 SetOption(inno_ImageEncoder_GetPngCompressionLevelId(), level);
313 visitor.Visit(*
this);
323 static const int DefaultLevel = 9;
324 std::atomic<int> lev;
357 static const int MinQuality = 0;
358 static const int MaxQuality = 100;
359 if (quality < MinQuality || quality > MaxQuality)
364 SetOption(inno_ImageEncoder_GeJpgQualityId(), quality);
386 SetOption(inno_ImageEncoder_GeJpgProgressiveId(), isOn ? 1 : 0);
407 SetOption(inno_ImageEncoder_GeJpgOptimizedId(), isOn ? 1 : 0);
422 visitor.Visit(*
this);
432 static const int DefaultQuality = 95;
434 std::atomic<bool> pf;
517 if (!IsCompressionValid(compression))
520 std::to_string(compression));
524 SetOption(inno_ImageEncoder_GetTiffCompressionId(), compression);
538 visitor.Visit(*
this);
548 std::atomic<Compression> comp;
550 void AddOptionsForImageAttributes(
const RawImage& image,
551 const std::function<
void(
int,
int)>& addOption)
const final
553 constexpr int ResultUnitInch = 2;
554 addOption(inno_ImageEncoder_GetTiffUnitId(), ResultUnitInch);
555 addOption(inno_ImageEncoder_GetTiffXDpiId(),
static_cast<int>(
static_cast<unsigned int>(image.
dpi)));
556 addOption(inno_ImageEncoder_GetTiffYDpiId(),
static_cast<int>(
static_cast<unsigned int>(image.
dpi)));
559 static bool IsCompressionValid(
const Compression compression)
624 : SupportedImageEncoder(
ImageType::JPG2000)
648 static const int MaxRatio = 1000;
649 static const int MinRatio = 1;
650 if (ratio < MinRatio || ratio > MaxRatio)
657 auto rate = MaxRatio / ratio;
658 SetOption(inno_ImageEncoder_GetJpg2000CompressionRateId(), rate);
692 visitor.Visit(*
this);
730 static const int MinQuality = 0;
731 static const int MaxQuality = 100;
732 if (quality < MinQuality || quality > MaxQuality)
737 SetOption(inno_ImageEncoder_GeWebpQualityId(), quality);
751 visitor.Visit(*
this);
761 static const int DefaultQuality = 95;
782 visitor.Visit(*
this);
798 static constexpr float MaxBitrate = 5.0F;
799 static constexpr float MinBitrate = 0.1F;
800 if (bitrate < MinBitrate || bitrate > MaxBitrate)
823 static constexpr float WsqBitrateDefault = 1.25;
824 static constexpr int WsqBitrateId = 1;
825 static constexpr float WsqBitrateCoeff = 100.F;
828 std::atomic<float> b = WsqBitrateDefault;
830 void AddOptionsForImageAttributes(
const RawImage& ,
831 const std::function<
void(
int,
int)>& addOption)
const final
833 const auto bitrate =
static_cast<int>(b * WsqBitrateCoeff);
834 addOption(WsqBitrateId, bitrate);
842 class IRawImageEncoder :
public ImageEncoder
851 [[nodiscard]] std::vector<uint8_t>
Encode(
const RawImage& raw)
const final
853 if (raw.height == 0 || raw.width == 0 || raw.channels == 0 || raw.Data().empty())
858 std::vector<uint8_t> encoded(inno_ImageEncoder_GetRawLength(raw.height, raw.width, raw.channels));
859 inno_ImageEncoder_EncodeRaw(encoded.data(),
862 static_cast<unsigned int>(raw.dpi),
871 visitor.Visit(*
this);
887 return std::make_shared<BmpImageEncoder>();
889 return std::make_shared<PngImageEncoder>();
891 return std::make_shared<WsqImageEncoder>();
893 return std::make_shared<IRawImageEncoder>();
895 return std::make_shared<JpgImageEncoder>();
897 return std::make_shared<TiffImageEncoder>();
899 return std::make_shared<Jp2ImageEncoder>();
901 return std::make_shared<WebpImageEncoder>();
920 ImageSaver() =
default;
921 ImageSaver(
const ImageSaver&) =
delete;
922 ImageSaver(ImageSaver&&) =
delete;
923 ImageSaver& operator=(
const ImageSaver&) =
delete;
924 ImageSaver& operator=(ImageSaver&&) =
delete;
925 virtual ~ImageSaver() =
default;
941 : fp(std::move(path))
955 auto extension = fp.substr(fp.find_last_of(
'.'), fp.length());
957 BinaryFile::WriteAll(fp, encoder->Encode(raw));
Converts image type ImageType::BMP.
Definition ImageEncoder.h:243
BmpImageEncoder()
Construct a new BMP Image Encoder object.
Definition ImageEncoder.h:248
void Accept(ImageEncoderVisitor &visitor) const final
Allow visitor to visit concrete type of encoder.
Definition ImageEncoder.h:253
Base exception for all enrollment-sdk invalid argument exceptions.
Definition EnrollmentException.h:96
Saves RawImage image to memory.
Definition ImageEncoder.h:842
std::vector< uint8_t > Encode(const RawImage &raw) const final
Saves given RawImage in innovatrics raw image format.
Definition ImageEncoder.h:850
void Accept(ImageEncoderVisitor &visitor) const final
Allow visitor to visit concrete type of encoder.
Definition ImageEncoder.h:868
The class is used to visit concrete encoder to get concrete data.
Definition ImageEncoder.h:81
virtual void Accept(ImageEncoderVisitor &visitor) const =0
Allow visitor to visit concrete type of encoder.
static std::shared_ptr< ImageEncoder > Create(ImageType type)
Create concrete default encoder for given type.
Definition ImageEncoder.h:881
virtual std::vector< uint8_t > Encode(const RawImage &raw) const =0
Encodes given RawImage as encoded image.
Exception for image processing.
Definition ImageException.h:24
@ UNKNOWN_IMAGE
Image type is not supported.
Definition ImageException.h:35
Saves image to file.
Definition ImageEncoder.h:933
ImageFileSaver(std::string path)
Construct a new Image File Encoder object.
Definition ImageEncoder.h:939
void Save(const RawImage &raw) const final
Saves given RawImage as encoded image.
Definition ImageEncoder.h:952
virtual void Save(const RawImage &raw) const =0
Encodes and saves given image.
It contains all supported image types.
Definition ImageType.h:21
static ImageType FromFileExtension(const std::string &extension)
Construct ImageType from file extension.
Definition ImageType.h:166
Type
Type of supported images.
Definition ImageType.h:27
@ JPG2000
JPEG 2000 is an image compression standard and coding system - jp2.
Definition ImageType.h:76
@ JPG
Joint Photographic Experts Group - jpeg, jpg, jpe.
Definition ImageType.h:59
@ BMP
Windows bitmaps - bmp, dib.
Definition ImageType.h:32
@ TIFF
Tagged Image File Format - tiff, tif.
Definition ImageType.h:65
@ PNG
Portable Network Graphics - png.
Definition ImageType.h:39
@ WEBP
WebP is an image file format developed by Google - webp.
Definition ImageType.h:82
@ IRAW
Innovatrics proprietary RAW image - iraw.
Definition ImageType.h:52
@ WSQ
Wavelet Scalar Quantization - wsq.
Definition ImageType.h:46
Image has wrong format or dimensions or dpi and is not suitable for processing.
Definition EnrollmentException.h:144
Converts image type ImageType::JPG2000.
Definition ImageEncoder.h:616
void SetCompressionRatio(int ratio)
Set compression ratio.
Definition ImageEncoder.h:645
bool IsLossy() const
Check if encoder setup is lossy.
Definition ImageEncoder.h:674
bool IsLossless() const
Check if encoder setup is lossless.
Definition ImageEncoder.h:684
void Accept(ImageEncoderVisitor &visitor) const final
Allow visitor to visit concrete type of encoder.
Definition ImageEncoder.h:689
int GetCompressionRatio() const
Provides compression ratio.
Definition ImageEncoder.h:664
Jp2ImageEncoder()
Construct a new Jpeg 2000 Image Encoder object The default compression ratio is 4:1.
Definition ImageEncoder.h:622
Converts image type ImageType::JPG.
Definition ImageEncoder.h:331
void SetQuality(int quality)
Set quality.
Definition ImageEncoder.h:354
bool GetProgressive() const
Provides Progressive Feature.
Definition ImageEncoder.h:393
bool GetOptimize() const
Provides Optimize Feature.
Definition ImageEncoder.h:414
void SetProgressive(bool isOn)
Set the Progressive Feature A progressive JPEG image is encoded differently than a standard or baseli...
Definition ImageEncoder.h:382
void Accept(ImageEncoderVisitor &visitor) const final
Allow visitor to visit concrete type of encoder.
Definition ImageEncoder.h:419
JpgImageEncoder()
Construct a new JPG Image Encoder object.
Definition ImageEncoder.h:341
int GetQuality() const
Provides quality.
Definition ImageEncoder.h:370
void SetOptimize(bool isOn)
Set the Optimize Feature.
Definition ImageEncoder.h:403
Converts image type ImageType::PNG.
Definition ImageEncoder.h:270
void SetCompressionLevel(int level)
Set compression level.
Definition ImageEncoder.h:289
PngImageEncoder()
Construct a new Png Image Encoder object The default compression level is 9.
Definition ImageEncoder.h:276
void Accept(ImageEncoderVisitor &visitor) const final
Allow visitor to visit concrete type of encoder.
Definition ImageEncoder.h:310
int GetCompressionLevel() const
Provides compression level.
Definition ImageEncoder.h:305
Contains plain image data.
Definition ImageAttribute.h:135
const ImageDpi dpi
Image DPI.
Definition ImageAttribute.h:170
Encodes raw images into specified supported format, It is used as based class for all supported forma...
Definition ImageEncoder.h:143
std::vector< uint8_t > Encode(const RawImage &raw) const final
Saves given RawImage as formatted image.
Definition ImageEncoder.h:152
Converts image type ImageType::TIFF.
Definition ImageEncoder.h:442
Compression
Compression supported for tiff images.
Definition ImageEncoder.h:458
@ IT8LW
IT8 LW.
Definition ImageEncoder.h:486
@ CCITTRLE
CCITT RLE.
Definition ImageEncoder.h:462
@ IT8BL
IT8 BL.
Definition ImageEncoder.h:490
@ JP2000
JP2000.
Definition ImageEncoder.h:506
@ CCITT_T6
CCITT T6.
Definition ImageEncoder.h:470
@ THUNDERSCAN
THUNDERSCAN.
Definition ImageEncoder.h:482
@ LZW
LZW.
Definition ImageEncoder.h:472
@ ADOBE_DEFLATE
ADOBE DEFLATE.
Definition ImageEncoder.h:498
@ CCITTFAX3
CCITT FAX3.
Definition ImageEncoder.h:464
@ CCITTFAX4
CCITT FAX4.
Definition ImageEncoder.h:468
@ IT8MP
IT8 MP.
Definition ImageEncoder.h:488
@ IT8CTPAD
IT8 CTPAD.
Definition ImageEncoder.h:484
@ SGILOG
SGI LOG.
Definition ImageEncoder.h:502
@ JPEG
JPEG.
Definition ImageEncoder.h:474
@ CCITT_T4
CCITT T4.
Definition ImageEncoder.h:466
@ DCS
DCS.
Definition ImageEncoder.h:500
@ NEXT
NEXT.
Definition ImageEncoder.h:476
@ CCITTRLEW
CCITT RLE W.
Definition ImageEncoder.h:478
@ NONE
No compression.
Definition ImageEncoder.h:460
@ PIXARLOG
PIXAR LOG.
Definition ImageEncoder.h:494
@ PIXARFILM
PIXAR FILM.
Definition ImageEncoder.h:492
@ SGILOG24
SGI LOG24.
Definition ImageEncoder.h:504
@ DEFLATE
DEFLATE.
Definition ImageEncoder.h:496
@ PACKBITS
PACKBITS.
Definition ImageEncoder.h:480
TiffImageEncoder()
Construct a new Tiff Image Encoder object.
Definition ImageEncoder.h:448
void SetCompression(Compression compression)
Set compression level.
Definition ImageEncoder.h:514
Compression GetCompression() const
Provides compression.
Definition ImageEncoder.h:530
void Accept(ImageEncoderVisitor &visitor) const final
Allow visitor to visit concrete type of encoder.
Definition ImageEncoder.h:535
Converts image type ImageType::WEBP.
Definition ImageEncoder.h:709
void SetQuality(int quality)
Set quality.
Definition ImageEncoder.h:727
WebpImageEncoder()
Construct a new webp Image Encoder object The default quality is set to 95.
Definition ImageEncoder.h:715
void Accept(ImageEncoderVisitor &visitor) const final
Allow visitor to visit concrete type of encoder.
Definition ImageEncoder.h:748
int GetQuality() const
Provides quality.
Definition ImageEncoder.h:743
Converts image type ImageType::WSQ.
Definition ImageEncoder.h:769
WsqImageEncoder()
Construct a new WSQ Image Encoder object.
Definition ImageEncoder.h:774
void Accept(ImageEncoderVisitor &visitor) const final
Allow visitor to visit concrete type of encoder.
Definition ImageEncoder.h:779
float GetBitrate() const
Provides WSQ image bitrate.
Definition ImageEncoder.h:811
void SetBitrate(float bitrate)
Set the bitrate for WSQ compression.
Definition ImageEncoder.h:795