Роман Protocol
Мыслитель
(8562),
на голосовании
6 лет назад
Всем привет! Настроил SFML. Каму интересно инструкция по настройке здесь https://www.youtube.com/watch?v=1KXOL7-XfMk Реализовал в коде алгоритм преобразования изображений "Серый мир". Вот результаты работы алгоритма (с цифрой 5 - это результат) https://yadi.sk/d/woOhASrq3SVKFD Почему некоторые изображения портятся, а на некоторых алгоритм верно срабатывает? Что поправить в коде и как? Спасибо за ответы!
#include < SFML/Graphics.hpp > //Для работы с изображением, только при установленной библиотеке SFML #include < iostream > #include < iomanip >
using namespace sf; //Область имён для работы сущностей SFML using namespace std;
int main() { setlocale(LC_ALL, "rus"); Image heroimage; //Создание единичного экземпляра стороннего класса Image heroimage.loadFromFile("Images/Лепески. jpg"); //Чтение изображения в экземпляр класса //Папку Image располагать рядом с Sourse.cpp текущего проекта cout << heroimage.getSize().x << endl; //Выводим в консоль размер изображения ширина cout << heroimage.getSize().y << endl; //Выводим в консоль размер изображения высота int rr = 0; int gg = 0; int bb = 0; for (unsigned u = 0; u < heroimage.getSize().x; ++u) //Листаем пикселы в копии изображения в экземпляре heroimage { for (unsigned p = 0; p < heroimage.getSize().y; ++p) { Color cl = heroimage.getPixel(u, p); //Считывание цвета для пиксела с заданными координатами rr += cl.r; gg += cl.g; bb += cl.b; } } double avg = (rr + gg + bb) / 3.0; for (unsigned u = 0; u < heroimage.getSize().x; ++u) //Листаем пикселы в копии изображения в экземпляре heroimage { for (unsigned p = 0; p < heroimage.getSize().y; ++p) { Color cl = heroimage.getPixel(u, p); Color ct(cl.r * (double)(avg / rr) > 255? 255 : cl.r * (double)(avg / rr), cl.g * (double)(avg / gg) > 255? 255 : cl.g * (double)(avg / gg), cl.b * (double)(avg / bb) > 255? 255 : cl.b * (double)(avg / bb) ); heroimage.setPixel(u, p, ct); } } heroimage.saveToFile("Images/Лепески5.jpg"); //Сохранение преобразованного изображения, создание нового файла cout << "Готово" << endl;
Настроил SFML. Каму интересно инструкция по настройке здесь https://www.youtube.com/watch?v=1KXOL7-XfMk
Реализовал в коде алгоритм преобразования изображений "Серый мир".
Вот результаты работы алгоритма (с цифрой 5 - это результат) https://yadi.sk/d/woOhASrq3SVKFD
Почему некоторые изображения портятся, а на некоторых алгоритм верно срабатывает?
Что поправить в коде и как?
Спасибо за ответы!
#include < SFML/Graphics.hpp > //Для работы с изображением, только при установленной библиотеке SFML
#include < iostream >
#include < iomanip >
using namespace sf; //Область имён для работы сущностей SFML
using namespace std;
int main()
{
setlocale(LC_ALL, "rus");
Image heroimage; //Создание единичного экземпляра стороннего класса Image
heroimage.loadFromFile("Images/Лепески. jpg"); //Чтение изображения в экземпляр класса
//Папку Image располагать рядом с Sourse.cpp текущего проекта
cout << heroimage.getSize().x << endl; //Выводим в консоль размер изображения ширина
cout << heroimage.getSize().y << endl; //Выводим в консоль размер изображения высота
int rr = 0;
int gg = 0;
int bb = 0;
for (unsigned u = 0; u < heroimage.getSize().x; ++u) //Листаем пикселы в копии изображения в экземпляре heroimage
{
for (unsigned p = 0; p < heroimage.getSize().y; ++p)
{
Color cl = heroimage.getPixel(u, p); //Считывание цвета для пиксела с заданными координатами
rr += cl.r;
gg += cl.g;
bb += cl.b;
}
}
double avg = (rr + gg + bb) / 3.0;
for (unsigned u = 0; u < heroimage.getSize().x; ++u) //Листаем пикселы в копии изображения в экземпляре heroimage
{
for (unsigned p = 0; p < heroimage.getSize().y; ++p)
{
Color cl = heroimage.getPixel(u, p);
Color ct(cl.r * (double)(avg / rr) > 255? 255 : cl.r * (double)(avg / rr),
cl.g * (double)(avg / gg) > 255? 255 : cl.g * (double)(avg / gg),
cl.b * (double)(avg / bb) > 255? 255 : cl.b * (double)(avg / bb)
);
heroimage.setPixel(u, p, ct);
}
}
heroimage.saveToFile("Images/Лепески5.jpg"); //Сохранение преобразованного изображения, создание нового файла
cout << "Готово" << endl;
cin.get(); cin.get();
}