Advertisement
Tark_Wight

Untitled

Apr 2nd, 2023
28
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 1.67 KB | None | 0 0
  1. #include <iostream>
  2. #include <cstring>
  3. #include <xmmintrin.h>
  4. #include "lodepng.h"
  5.  
  6. void negateImage(const char* inputFilename, const char* outputFilename) {
  7. unsigned error;
  8. unsigned char* image;
  9. unsigned width, height;
  10.  
  11. error = lodepng_decode24_file(&image, &width, &height, inputFilename);
  12. if (error) {
  13. std::cerr << "Failed to load image: " << lodepng_error_text(error) << std::endl;
  14. return;
  15. }
  16.  
  17. // Фильтр негатива
  18. const __m128i ones = _mm_set1_epi8(255); // Создаем вектор из 16 единиц
  19. for (unsigned y = 0; y < height; ++y) {
  20. unsigned index = y * width * 3;
  21. unsigned length = width * 3;
  22. unsigned char* row = image + index;
  23. unsigned char* end = row + length;
  24.  
  25. // Выполняем векторизованную операцию вычитания из 255
  26. for (; row + 15 < end; row += 16) {
  27. __m128i data = _mm_load_si128((__m128i*)row); // Загружаем 16 байт (пикселей) изображения
  28. data = _mm_sub_epi8(ones, data); // Вычитаем из 255
  29. _mm_store_si128((__m128i*)row, data); // Сохраняем обратно в память
  30. }
  31.  
  32. // Выполняем невекторизованную операцию вычитания из 255
  33. for (; row < end; ++row) {
  34. *row = 255 - *row;
  35. }
  36. }
  37.  
  38. error = lodepng_encode24_file(outputFilename, image, width, height);
  39. if (error) {
  40. std::cerr << "Failed to save image: " << lodepng_error_text(error) << std::endl;
  41. return;
  42. }
  43.  
  44. free(image);
  45. }
  46.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement