Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <iostream>
- #include <cstring>
- #include <xmmintrin.h>
- #include "lodepng.h"
- void negateImage(const char* inputFilename, const char* outputFilename) {
- unsigned error;
- unsigned char* image;
- unsigned width, height;
- error = lodepng_decode24_file(&image, &width, &height, inputFilename);
- if (error) {
- std::cerr << "Failed to load image: " << lodepng_error_text(error) << std::endl;
- return;
- }
- // Фильтр негатива
- const __m128i ones = _mm_set1_epi8(255); // Создаем вектор из 16 единиц
- for (unsigned y = 0; y < height; ++y) {
- unsigned index = y * width * 3;
- unsigned length = width * 3;
- unsigned char* row = image + index;
- unsigned char* end = row + length;
- // Выполняем векторизованную операцию вычитания из 255
- for (; row + 15 < end; row += 16) {
- __m128i data = _mm_load_si128((__m128i*)row); // Загружаем 16 байт (пикселей) изображения
- data = _mm_sub_epi8(ones, data); // Вычитаем из 255
- _mm_store_si128((__m128i*)row, data); // Сохраняем обратно в память
- }
- // Выполняем невекторизованную операцию вычитания из 255
- for (; row < end; ++row) {
- *row = 255 - *row;
- }
- }
- error = lodepng_encode24_file(outputFilename, image, width, height);
- if (error) {
- std::cerr << "Failed to save image: " << lodepng_error_text(error) << std::endl;
- return;
- }
- free(image);
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement