Neuron®
The Neuron® is the basis for the creation of open and secure federated networks for smart societies.
Loading...
Searching...
No Matches
ImageCodec.cs
1using SkiaSharp;
2using System;
4using System.Text;
5using System.Threading.Tasks;
7
9{
14 {
18 public ImageCodec()
19 {
20 }
21
25 public const string ContentTypeWebP = "image/webp";
26
30 public const string ContentTypePng = "image/png";
31
35 public const string ContentTypeJpg = "image/jpeg";
36
40 public const string ContentTypeIcon = "image/x-icon";
41
45 public const string ContentTypeSvg = "image/svg+xml";
46
50 public const string ContentTypeBmp = "image/bmp";
51
55 public const string ContentTypeGif = "image/gif";
56
60 public const string ContentTypeTiff = "image/tiff";
61
65 public const string ContentTypeWmf = "image/x-wmf";
66
70 public const string ContentTypeEmf = "image/x-emf";
71
75 public const string FileExtensionPng = "png";
76
80 public const string FileExtensionBmp = "bmp";
81
85 public const string FileExtensionGif = "gif";
86
90 public const string FileExtensionJpg = "jpg";
91
95 public const string FileExtensionWebP = "webp";
96
100 public const string FileExtensionTiff = "tif";
101
105 public const string FileExtensionWmf = "wmf";
106
110 public const string FileExtensionEmf = "emf";
111
115 public const string FileExtensionIcon = "ico";
116
120 public const string FileExtensionSvg = "svg";
121
122
126 public static readonly string[] ImageContentTypes = new string[]
127 {
137 };
138
142 public static readonly string[] ImageFileExtensions = new string[]
143 {
149 "jpeg",
151 "tiff",
155 };
156
160 public string[] ContentTypes => ImageContentTypes;
161
166
173 public bool Decodes(string ContentType, out Grade Grade)
174 {
175 if (Array.IndexOf(ImageContentTypes, ContentType) >= 0)
176 {
177 Grade = Grade.Excellent;
178 return true;
179 }
180 else if (ContentType.StartsWith("image/"))
181 {
182 Grade = Grade.Barely;
183 return true;
184 }
185 else
186 {
187 Grade = Grade.NotAtAll;
188 return false;
189 }
190 }
191
202 public Task<ContentResponse> DecodeAsync(string ContentType, byte[] Data, Encoding Encoding,
203 KeyValuePair<string, string>[] Fields, Uri BaseUri, ICodecProgress Progress)
204 {
205 SKBitmap Bitmap = SKBitmap.Decode(Data);
206 return Task.FromResult(new ContentResponse(ContentType, SKImage.FromBitmap(Bitmap), Data));
207 }
208
216 public bool Encodes(object Object, out Grade Grade, params string[] AcceptedContentTypes)
217 {
218 if ((Object is SKImage || Object is SKBitmap) &&
219 InternetContent.IsAccepted(ImageContentTypes, AcceptedContentTypes))
220 {
221 Grade = Grade.Ok;
222 return true;
223 }
224 else
225 {
226 Grade = Grade.NotAtAll;
227 return false;
228 }
229 }
230
239 public Task<ContentResponse> EncodeAsync(object Object, Encoding Encoding, ICodecProgress Progress, params string[] AcceptedContentTypes)
240 {
241 SKData Data;
242 bool Dispose = false;
243 string ContentType;
244 byte[] Bin;
245
246 if (!(Object is SKImage Image))
247 {
248 if (Object is SKBitmap Bitmap)
249 {
250 Image = SKImage.FromBitmap(Bitmap);
251 Dispose = true;
252 }
253 else
254 return Task.FromResult(new ContentResponse(new ArgumentException("Object not an image derived from SkiaSharp.SKImage or SkiaSharp.SKBitmap.", nameof(Object))));
255 }
256
257 if (InternetContent.IsAccepted(ContentTypeWebP, AcceptedContentTypes))
258 {
259 Data = Image.Encode(SKEncodedImageFormat.Webp, 100);
260 ContentType = ContentTypeWebP;
261 }
262 else if (InternetContent.IsAccepted(ContentTypePng, AcceptedContentTypes))
263 {
264 Data = Image.Encode(SKEncodedImageFormat.Png, 100);
265 ContentType = ContentTypePng;
266 }
267 else if (InternetContent.IsAccepted(ContentTypeBmp, AcceptedContentTypes))
268 {
269 Data = Image.Encode(SKEncodedImageFormat.Bmp, 100);
270 ContentType = ContentTypeBmp;
271 }
272 else if (InternetContent.IsAccepted(ContentTypeJpg, AcceptedContentTypes))
273 {
274 Data = Image.Encode(SKEncodedImageFormat.Jpeg, 90);
275 ContentType = ContentTypeJpg;
276 }
277 else if (InternetContent.IsAccepted(ContentTypeGif, AcceptedContentTypes))
278 {
279 Data = Image.Encode(SKEncodedImageFormat.Gif, 100);
280 ContentType = ContentTypeGif;
281 }
282 else if (InternetContent.IsAccepted(ContentTypeIcon, AcceptedContentTypes))
283 {
284 Data = Image.Encode(SKEncodedImageFormat.Ico, 100);
285 ContentType = ContentTypeIcon;
286 }
287 else
288 return Task.FromResult(new ContentResponse(new ArgumentException("Unable to encode object, or content type not accepted.", nameof(Object))));
289
290 Bin = Data.ToArray();
291 Data.Dispose();
292
293 if (Dispose)
294 Image.Dispose();
295
296 return Task.FromResult(new ContentResponse(ContentType, Object, Bin));
297 }
298
305 public bool TryGetContentType(string FileExtension, out string ContentType)
306 {
307 switch (FileExtension.ToLower())
308 {
309 case FileExtensionPng:
310 ContentType = ContentTypePng;
311 return true;
312
313 case FileExtensionBmp:
314 ContentType = ContentTypeBmp;
315 return true;
316
317 case FileExtensionGif:
318 ContentType = ContentTypeGif;
319 return true;
320
321 case FileExtensionJpg:
322 case "jpeg":
323 ContentType = ContentTypeJpg;
324 return true;
325
327 ContentType = ContentTypeWebP;
328 return true;
329
331 case "tiff":
332 ContentType = ContentTypeTiff;
333 return true;
334
335 case FileExtensionWmf:
336 ContentType = ContentTypeWmf;
337 return true;
338
339 case FileExtensionEmf:
340 ContentType = ContentTypeEmf;
341 return true;
342
344 ContentType = ContentTypeIcon;
345 return true;
346
347 case FileExtensionSvg:
348 ContentType = ContentTypeSvg;
349 return true;
350
351 default:
352 ContentType = string.Empty;
353 return false;
354 }
355 }
356
363 public bool TryGetFileExtension(string ContentType, out string FileExtension)
364 {
365 switch (ContentType.ToLower())
366 {
367 case ContentTypePng:
368 FileExtension = FileExtensionPng;
369 return true;
370
371 case ContentTypeBmp:
372 FileExtension = FileExtensionBmp;
373 return true;
374
375 case ContentTypeGif:
376 FileExtension = FileExtensionGif;
377 return true;
378
379 case ContentTypeJpg:
380 FileExtension = FileExtensionJpg;
381 return true;
382
383 case ContentTypeWebP:
384 FileExtension = FileExtensionWebP;
385 return true;
386
387 case ContentTypeTiff:
388 FileExtension = FileExtensionTiff;
389 return true;
390
391 case ContentTypeWmf:
392 FileExtension = FileExtensionWmf;
393 return true;
394
395 case ContentTypeEmf:
396 FileExtension = FileExtensionEmf;
397 return true;
398
399 case ContentTypeIcon:
400 FileExtension = FileExtensionIcon;
401 return true;
402
403 case ContentTypeSvg:
404 FileExtension = FileExtensionSvg;
405 return true;
406
407 default:
408 FileExtension = string.Empty;
409 return false;
410 }
411 }
412
413 }
414}
Contains information about a response to a content request.
Image encoder/decoder.
Definition: ImageCodec.cs:14
Task< ContentResponse > DecodeAsync(string ContentType, byte[] Data, Encoding Encoding, KeyValuePair< string, string >[] Fields, Uri BaseUri, ICodecProgress Progress)
Decodes an object.
Definition: ImageCodec.cs:202
const string FileExtensionJpg
jpg
Definition: ImageCodec.cs:90
const string ContentTypeJpg
image/jpeg
Definition: ImageCodec.cs:35
const string ContentTypeIcon
image/x-icon
Definition: ImageCodec.cs:40
const string ContentTypeWebP
image/webp
Definition: ImageCodec.cs:25
const string ContentTypeEmf
image/x-emf
Definition: ImageCodec.cs:70
const string ContentTypeGif
image/gif
Definition: ImageCodec.cs:55
static readonly string[] ImageFileExtensions
Image content types.
Definition: ImageCodec.cs:142
const string FileExtensionPng
png
Definition: ImageCodec.cs:75
bool Decodes(string ContentType, out Grade Grade)
If the decoder decodes an object with a given content type.
Definition: ImageCodec.cs:173
bool TryGetFileExtension(string ContentType, out string FileExtension)
Tries to get the file extension of an item, given its Content-Type.
Definition: ImageCodec.cs:363
const string FileExtensionWebP
webp
Definition: ImageCodec.cs:95
bool TryGetContentType(string FileExtension, out string ContentType)
Tries to get the content type of an item, given its file extension.
Definition: ImageCodec.cs:305
Task< ContentResponse > EncodeAsync(object Object, Encoding Encoding, ICodecProgress Progress, params string[] AcceptedContentTypes)
Encodes an object.
Definition: ImageCodec.cs:239
const string FileExtensionWmf
wmf
Definition: ImageCodec.cs:105
const string FileExtensionIcon
ico
Definition: ImageCodec.cs:115
string[] ContentTypes
Supported content types.
Definition: ImageCodec.cs:160
const string ContentTypePng
image/png
Definition: ImageCodec.cs:30
const string FileExtensionEmf
emf
Definition: ImageCodec.cs:110
ImageCodec()
Image encoder/decoder.
Definition: ImageCodec.cs:18
const string FileExtensionSvg
svg
Definition: ImageCodec.cs:120
const string ContentTypeBmp
image/bmp
Definition: ImageCodec.cs:50
const string ContentTypeTiff
image/tiff
Definition: ImageCodec.cs:60
const string ContentTypeWmf
image/x-wmf
Definition: ImageCodec.cs:65
const string ContentTypeSvg
image/svg+xml
Definition: ImageCodec.cs:45
bool Encodes(object Object, out Grade Grade, params string[] AcceptedContentTypes)
If the encoder encodes a given object.
Definition: ImageCodec.cs:216
const string FileExtensionGif
gif
Definition: ImageCodec.cs:85
string[] FileExtensions
Supported file extensions.
Definition: ImageCodec.cs:165
const string FileExtensionBmp
bmp
Definition: ImageCodec.cs:80
const string FileExtensionTiff
tif
Definition: ImageCodec.cs:100
static readonly string[] ImageContentTypes
Image content types.
Definition: ImageCodec.cs:126
Static class managing encoding and decoding of internet content.
static bool IsAccepted(string ContentType, params string[] AcceptedContentTypes)
Checks if a given content type is acceptable.
Interface for reporting progress about an encoding or decoding.
Basic interface for Internet Content decoders. A class implementing this interface and having a defau...
Basic interface for Internet Content encoders. A class implementing this interface and having a defau...
Grade
Grade enumeration
Definition: Grade.cs:7