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 System;
2using System.Collections.Generic;
3using System.Text;
4using SkiaSharp;
6using 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<object> DecodeAsync(string ContentType, byte[] Data, Encoding Encoding, KeyValuePair<string, string>[] Fields, Uri BaseUri)
203 {
204 SKBitmap Bitmap = SKBitmap.Decode(Data);
205 return Task.FromResult<object>(SKImage.FromBitmap(Bitmap));
206 }
207
215 public bool Encodes(object Object, out Grade Grade, params string[] AcceptedContentTypes)
216 {
217 if ((Object is SKImage || Object is SKBitmap) && InternetContent.IsAccepted(this.ContentTypes, AcceptedContentTypes))
218 {
219 Grade = Grade.Ok;
220 return true;
221 }
222 else
223 {
224 Grade = Grade.NotAtAll;
225 return false;
226 }
227 }
228
237 public Task<KeyValuePair<byte[], string>> EncodeAsync(object Object, Encoding Encoding, params string[] AcceptedContentTypes)
238 {
239 SKData Data;
240 bool Dispose = false;
241 string ContentType;
242 byte[] Bin;
243
244 if (!(Object is SKImage Image))
245 {
246 if (Object is SKBitmap Bitmap)
247 {
248 Image = SKImage.FromBitmap(Bitmap);
249 Dispose = true;
250 }
251 else
252 throw new ArgumentException("Object not an image derived from SkiaSharp.SKImage or SkiaSharp.SKBitmap.", nameof(Object));
253 }
254
255 if (InternetContent.IsAccepted(ContentTypeWebP, AcceptedContentTypes))
256 {
257 Data = Image.Encode(SKEncodedImageFormat.Webp, 100);
258 ContentType = ContentTypeWebP;
259 }
260 else if (InternetContent.IsAccepted(ContentTypePng, AcceptedContentTypes))
261 {
262 Data = Image.Encode(SKEncodedImageFormat.Png, 100);
263 ContentType = ContentTypePng;
264 }
265 else if (InternetContent.IsAccepted(ContentTypeBmp, AcceptedContentTypes))
266 {
267 Data = Image.Encode(SKEncodedImageFormat.Bmp, 100);
268 ContentType = ContentTypeBmp;
269 }
270 else if (InternetContent.IsAccepted(ContentTypeJpg, AcceptedContentTypes))
271 {
272 Data = Image.Encode(SKEncodedImageFormat.Jpeg, 90);
273 ContentType = ContentTypeJpg;
274 }
275 else if (InternetContent.IsAccepted(ContentTypeGif, AcceptedContentTypes))
276 {
277 Data = Image.Encode(SKEncodedImageFormat.Gif, 100);
278 ContentType = ContentTypeGif;
279 }
280 else if (InternetContent.IsAccepted(ContentTypeIcon, AcceptedContentTypes))
281 {
282 Data = Image.Encode(SKEncodedImageFormat.Ico, 100);
283 ContentType = ContentTypeIcon;
284 }
285 else
286 throw new ArgumentException("Unable to encode object, or content type not accepted.", nameof(Object));
287
288 Bin = Data.ToArray();
289 Data.Dispose();
290
291 if (Dispose)
292 Image.Dispose();
293
294 return Task.FromResult(new KeyValuePair<byte[], string>(Bin, ContentType));
295 }
296
303 public bool TryGetContentType(string FileExtension, out string ContentType)
304 {
305 switch (FileExtension.ToLower())
306 {
307 case FileExtensionPng:
308 ContentType = ContentTypePng;
309 return true;
310
311 case FileExtensionBmp:
312 ContentType = ContentTypeBmp;
313 return true;
314
315 case FileExtensionGif:
316 ContentType = ContentTypeGif;
317 return true;
318
319 case FileExtensionJpg:
320 case "jpeg":
321 ContentType = ContentTypeJpg;
322 return true;
323
325 ContentType = ContentTypeWebP;
326 return true;
327
329 case "tiff":
330 ContentType = ContentTypeTiff;
331 return true;
332
333 case FileExtensionWmf:
334 ContentType = ContentTypeWmf;
335 return true;
336
337 case FileExtensionEmf:
338 ContentType = ContentTypeEmf;
339 return true;
340
342 ContentType = ContentTypeIcon;
343 return true;
344
345 case FileExtensionSvg:
346 ContentType = ContentTypeSvg;
347 return true;
348
349 default:
350 ContentType = string.Empty;
351 return false;
352 }
353 }
354
361 public bool TryGetFileExtension(string ContentType, out string FileExtension)
362 {
363 switch (ContentType.ToLower())
364 {
365 case ContentTypePng:
366 FileExtension = FileExtensionPng;
367 return true;
368
369 case ContentTypeBmp:
370 FileExtension = FileExtensionBmp;
371 return true;
372
373 case ContentTypeGif:
374 FileExtension = FileExtensionGif;
375 return true;
376
377 case ContentTypeJpg:
378 FileExtension = FileExtensionJpg;
379 return true;
380
381 case ContentTypeWebP:
382 FileExtension = FileExtensionWebP;
383 return true;
384
385 case ContentTypeTiff:
386 FileExtension = FileExtensionTiff;
387 return true;
388
389 case ContentTypeWmf:
390 FileExtension = FileExtensionWmf;
391 return true;
392
393 case ContentTypeEmf:
394 FileExtension = FileExtensionEmf;
395 return true;
396
397 case ContentTypeIcon:
398 FileExtension = FileExtensionIcon;
399 return true;
400
401 case ContentTypeSvg:
402 FileExtension = FileExtensionSvg;
403 return true;
404
405 default:
406 FileExtension = string.Empty;
407 return false;
408 }
409 }
410
411 }
412}
Image encoder/decoder.
Definition: ImageCodec.cs:14
const string FileExtensionJpg
jpg
Definition: ImageCodec.cs:90
const string ContentTypeJpg
image/jpeg
Definition: ImageCodec.cs:35
Task< object > DecodeAsync(string ContentType, byte[] Data, Encoding Encoding, KeyValuePair< string, string >[] Fields, Uri BaseUri)
Decodes an object.
Definition: ImageCodec.cs:202
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:361
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:303
Task< KeyValuePair< byte[], string > > EncodeAsync(object Object, Encoding Encoding, params string[] AcceptedContentTypes)
Encodes an object.
Definition: ImageCodec.cs:237
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:215
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.
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