comparison UnitTestsSources/ImageTests.cpp @ 2699:52217dc47a4e

new image/pam MIME TYPE supported in /instances/../frames/../image-uint8... routes
author am@osimis.io
date Thu, 05 Jul 2018 12:25:00 +0200
parents 878b59270859
children 38a3054b22ff
comparison
equal deleted inserted replaced
2687:2c684841da15 2699:52217dc47a4e
39 #include "../Core/Images/ImageProcessing.h" 39 #include "../Core/Images/ImageProcessing.h"
40 #include "../Core/Images/JpegReader.h" 40 #include "../Core/Images/JpegReader.h"
41 #include "../Core/Images/JpegWriter.h" 41 #include "../Core/Images/JpegWriter.h"
42 #include "../Core/Images/PngReader.h" 42 #include "../Core/Images/PngReader.h"
43 #include "../Core/Images/PngWriter.h" 43 #include "../Core/Images/PngWriter.h"
44 #include "../Core/Images/PamReader.h"
45 #include "../Core/Images/PamWriter.h"
44 #include "../Core/Toolbox.h" 46 #include "../Core/Toolbox.h"
45 #include "../Core/TemporaryFile.h" 47 #include "../Core/TemporaryFile.h"
46 #include "../OrthancServer/OrthancInitialization.h" // For the FontRegistry 48 #include "../OrthancServer/OrthancInitialization.h" // For the FontRegistry
47 49
48 #include <stdint.h> 50 #include <stdint.h>
267 269
268 Orthanc::PngWriter w; 270 Orthanc::PngWriter w;
269 w.WriteToFile("UnitTestsResults/font.png", s); 271 w.WriteToFile("UnitTestsResults/font.png", s);
270 } 272 }
271 273
274 TEST(PamWriter, ColorPattern)
275 {
276 Orthanc::PamWriter w;
277 unsigned int width = 17;
278 unsigned int height = 61;
279 unsigned int pitch = width * 3;
280
281 std::vector<uint8_t> image(height * pitch);
282 for (unsigned int y = 0; y < height; y++)
283 {
284 uint8_t *p = &image[0] + y * pitch;
285 for (unsigned int x = 0; x < width; x++, p += 3)
286 {
287 p[0] = (y % 3 == 0) ? 255 : 0;
288 p[1] = (y % 3 == 1) ? 255 : 0;
289 p[2] = (y % 3 == 2) ? 255 : 0;
290 }
291 }
292
293 Orthanc::ImageAccessor accessor;
294 accessor.AssignReadOnly(Orthanc::PixelFormat_RGB24, width, height, pitch, &image[0]);
295
296 w.WriteToFile("UnitTestsResults/ColorPattern.pam", accessor);
297
298 std::string f, md5;
299 Orthanc::SystemToolbox::ReadFile(f, "UnitTestsResults/ColorPattern.pam");
300 Orthanc::Toolbox::ComputeMD5(md5, f);
301 ASSERT_EQ("81a3441754e88969ebbe53e69891e841", md5);
302 }
303
304 TEST(PamWriter, Gray8Pattern)
305 {
306 Orthanc::PamWriter w;
307 int width = 17;
308 int height = 256;
309 int pitch = width;
310
311 std::vector<uint8_t> image(height * pitch);
312 for (int y = 0; y < height; y++)
313 {
314 uint8_t *p = &image[0] + y * pitch;
315 for (int x = 0; x < width; x++, p++)
316 {
317 *p = y;
318 }
319 }
320
321 Orthanc::ImageAccessor accessor;
322 accessor.AssignReadOnly(Orthanc::PixelFormat_Grayscale8, width, height, pitch, &image[0]);
323
324 w.WriteToFile("UnitTestsResults/Gray8Pattern.pam", accessor);
325
326 std::string f, md5;
327 Orthanc::SystemToolbox::ReadFile(f, "UnitTestsResults/Gray8Pattern.pam");
328 Orthanc::Toolbox::ComputeMD5(md5, f);
329 ASSERT_EQ("7873c408d26a9d11dd1c1de5e69cc0a3", md5);
330 }
331
332 TEST(PamWriter, Gray16Pattern)
333 {
334 Orthanc::PamWriter w;
335 int width = 256;
336 int height = 256;
337 int pitch = width * 2 + 16;
338
339 std::vector<uint8_t> image(height * pitch);
340
341 int v = 0;
342 for (int y = 0; y < height; y++)
343 {
344 uint16_t *p = reinterpret_cast<uint16_t*>(&image[0] + y * pitch);
345 for (int x = 0; x < width; x++, p++, v++)
346 {
347 *p = v;
348 }
349 }
350
351 Orthanc::ImageAccessor accessor;
352 accessor.AssignReadOnly(Orthanc::PixelFormat_Grayscale16, width, height, pitch, &image[0]);
353 w.WriteToFile("UnitTestsResults/Gray16Pattern.pam", accessor);
354
355 std::string f, md5;
356 Orthanc::SystemToolbox::ReadFile(f, "UnitTestsResults/Gray16Pattern.pam");
357 Orthanc::Toolbox::ComputeMD5(md5, f);
358 ASSERT_EQ("b268772bf28f3b2b8520ff21c5e3dcb6", md5);
359 }
360
361 TEST(PamWriter, EndToEnd)
362 {
363 Orthanc::PamWriter w;
364 unsigned int width = 256;
365 unsigned int height = 256;
366 unsigned int pitch = width * 2 + 16;
367
368 std::vector<uint8_t> image(height * pitch);
369
370 int v = 0;
371 for (unsigned int y = 0; y < height; y++)
372 {
373 uint16_t *p = reinterpret_cast<uint16_t*>(&image[0] + y * pitch);
374 for (unsigned int x = 0; x < width; x++, p++, v++)
375 {
376 *p = v;
377 }
378 }
379
380 Orthanc::ImageAccessor accessor;
381 accessor.AssignReadOnly(Orthanc::PixelFormat_Grayscale16, width, height, pitch, &image[0]);
382
383 std::string s;
384 w.WriteToMemory(s, accessor);
385
386 {
387 Orthanc::PamReader r;
388 r.ReadFromMemory(s);
389
390 ASSERT_EQ(r.GetFormat(), Orthanc::PixelFormat_Grayscale16);
391 ASSERT_EQ(r.GetWidth(), width);
392 ASSERT_EQ(r.GetHeight(), height);
393
394 v = 0;
395 for (unsigned int y = 0; y < height; y++)
396 {
397 const uint16_t *p = reinterpret_cast<const uint16_t*>((const uint8_t*) r.GetConstBuffer() + y * r.GetPitch());
398 ASSERT_EQ(p, r.GetConstRow(y));
399 for (unsigned int x = 0; x < width; x++, p++, v++)
400 {
401 ASSERT_EQ(v, *p);
402 }
403 }
404 }
405
406 {
407 Orthanc::TemporaryFile tmp;
408 Orthanc::SystemToolbox::WriteFile(s, tmp.GetPath());
409
410 Orthanc::PamReader r2;
411 r2.ReadFromFile(tmp.GetPath());
412
413 ASSERT_EQ(r2.GetFormat(), Orthanc::PixelFormat_Grayscale16);
414 ASSERT_EQ(r2.GetWidth(), width);
415 ASSERT_EQ(r2.GetHeight(), height);
416
417 v = 0;
418 for (unsigned int y = 0; y < height; y++)
419 {
420 const uint16_t *p = reinterpret_cast<const uint16_t*>((const uint8_t*) r2.GetConstBuffer() + y * r2.GetPitch());
421 ASSERT_EQ(p, r2.GetConstRow(y));
422 for (unsigned int x = 0; x < width; x++, p++, v++)
423 {
424 ASSERT_EQ(*p, v);
425 }
426 }
427 }
428 }
429