Есть часть кода C# в переменной, как вставить эту переменную в снипет?

dizellbtt

Client
Регистрация
08.01.2021
Сообщения
8
Благодарностей
1
Баллы
3
Всем привет. Первая моя тема на форуме, не судите строго за описание проблемы.

В С# я откровенный нубас. Есть код:

C#:
string InputImagePath = @"Путь1";
string SaveImagePath = @"Путь2";
using (MagickImage image = new MagickImage(InputImagePath)){
       image.Grayscale();
       image.Write(SaveImagePath);
}
Можно ли заменить image.Grayscale(); на переменную и кубиком постера менять значение этой переменной? Или придется создать тонну кубиков под каждую вариацию...

Пытался сделать так:

C#:
string InputImagePath = @"Путь1";
string SaveImagePath = @"Путь2";
using (MagickImage image = new MagickImage(InputImagePath)){
    project.Variables["stroka"].Value;
    image.Write(SaveImagePath);
}
Получил ошибку:
Компиляция кода Ошибка в действии "CS0201" "Only assignment, call, increment, decrement, await, and new object expressions can be used as a statement". [Строка: 4; Cтолбец: 2]

Во вложения добавил библиотеки для теста. Буду очень признателен за помощь.
 

Вложения

Последнее редактирование:

BAZAg

Client
Регистрация
08.11.2015
Сообщения
1 760
Благодарностей
2 398
Баллы
113
А что находится внутри переменной project.Variables["stroka"].Value?
И что по Вашим предположениям хранится в image.Grayscale(), что Вы решили что это строка, и что нужно её заменить?

Если нужно несколько вариаций - ну, тогда наверно в переменной будет храниться какое-то условие, например серый, а дальше уже ветвление можно сделать через switch вызывая нужный метод в зависимости от содержимого переменной. Пример ниже добавил.
C#:
string InputImagePath = @"Путь1";
string SaveImagePath = @"Путь2";
string line = project.Variables["stroka"].Value;
using (MagickImage image = new MagickImage(InputImagePath)){

       switch(line ){
         case "grey":  image.Grayscale(); break;
        case "gamma":  image.AutoGamma() ; break;
        case "red":  image.Grayscale(); break;
       default: break;
       }
     
       image.Write(SaveImagePath);
}
 
  • Спасибо
Реакции: djaga

dizellbtt

Client
Регистрация
08.01.2021
Сообщения
8
Благодарностей
1
Баллы
3
А что находится внутри переменной project.Variables["stroka"].Value?
И что по Вашим предположениям хранится в image.Grayscale(), что Вы решили что это строка, и что нужно её заменить?
В переменной будет находится последовательность фильтров для обработки.
Пример содержания переменной:
image.Grayscale()
image.AutoGamma()
image.Grayscale() - непосредственно сам фильтр
 

BAZAg

Client
Регистрация
08.11.2015
Сообщения
1 760
Благодарностей
2 398
Баллы
113
В переменной будет находится последовательность фильтров для обработки.
Пример содержания переменной:
image.Grayscale()
image.AutoGamma()
image.Grayscale() - непосредственно сам фильтр
В сообщение выше добавил пример того, как можно организовать ветвление в зависимости от условия.
 

dizellbtt

Client
Регистрация
08.01.2021
Сообщения
8
Благодарностей
1
Баллы
3
А что находится внутри переменной project.Variables["stroka"].Value?
И что по Вашим предположениям хранится в image.Grayscale(), что Вы решили что это строка, и что нужно её заменить?

Если нужно несколько вариаций - ну, тогда наверно в переменной будет храниться какое-то условие, например серый, а дальше уже ветвление можно сделать через switch вызывая нужный метод в зависимости от содержимого переменной. Пример ниже добавил.
C#:
string InputImagePath = @"Путь1";
string SaveImagePath = @"Путь2";
string line = project.Variables["stroka"].Value;
using (MagickImage image = new MagickImage(InputImagePath)){

       switch(line ){
         case "grey":  image.Grayscale(); break;
        case "gamma":  image.AutoGamma() ; break;
        case "red":  image.Grayscale(); break;
       default: break;
       }
  
       image.Write(SaveImagePath);
}
Спасибо, а есть возможность изменять именно последовательность фильтров? Условно у меня есть 4 фильтра. Количество всех возможных вариаций перестановок - 24. Чтоб мне не прописывать каждый кубик, я хотел использовать переменные для ротации строк
 

n0n3mi1y

Client
Регистрация
08.03.2017
Сообщения
1 125
Благодарностей
481
Баллы
83
Спасибо, а есть возможность изменять именно последовательность фильтров? Условно у меня есть 4 фильтра. Количество всех возможных вариаций перестановок - 24. Чтоб мне не прописывать каждый кубик, я хотел использовать переменные для ротации строк
Как устроите логику - уже сугубо ваше дело. Можете сделать для себя какие-то обозначения, к примеру, пусть переменная будет выглядеть так:
GR;GA;GR;GR

Далее разбиваете через сплит все эти значения и через цикл применяете необходимые фильтры.
 
  • Спасибо
Реакции: dizellbtt

BAZAg

Client
Регистрация
08.11.2015
Сообщения
1 760
Благодарностей
2 398
Баллы
113
Спасибо, а есть возможность изменять именно последовательность фильтров? Условно у меня есть 4 фильтра. Количество всех возможных вариаций перестановок - 24. Чтоб мне не прописывать каждый кубик, я хотел использовать переменные для ротации строк
Подавайте строку, в месте где нужно огранизовать обработку разными фильтами - дёргайте в цикле по символу - в зависимости от символа - вызывайте нужную обработку.
В зависимости от того какая строка будет подана на вход - будет другая последовательность вызова фильтров.
То что Вы хотите называется конечный автомат (можете погуглить на ютубе) или паттерн состояние State.
Пример обработки, как я это вижу добавил на картинке.
98021
C#:
string InputImagePath = @"Путь1";
string SaveImagePath = @"Путь2";
string filter =  "221a213"; // project.Variables["stroka"].Value;
using (MagickImage image = new MagickImage(InputImagePath)){

    for(int i=0;i<filter.Length;i++) {
        switch(filter[i]){
            case '1': image.Grayscale(); break;
            case '2': image.AutoGamma(); break;
            case '3': image.AutoGamma(); break;
            case 'a': image.Grayscale(); break;   
            // добавляем много разных фильтров   
            default: project.SendInfoToLog("Сработал фильтр не найден"); break;
        }
    }
    project.SendInfoToLog("Обработка завершена");
    image.Write(SaveImagePath);
}
 
Последнее редактирование:
  • Спасибо
Реакции: djaga и dizellbtt

dizellbtt

Client
Регистрация
08.01.2021
Сообщения
8
Благодарностей
1
Баллы
3
Подавайте строку, в месте где нужно огранизовать обработку разными фильтами - дёргайте в цикле по символу - в зависимости от символа - вызывайте нужную обработку.
В зависимости от того какая строка будет подана на вход - будет другая последовательность вызова фильтров.
То что Вы хотите называется конечный автомат (можете погуглить на ютубе) или паттерн состояние State.
Пример обработки, как я это вижу добавил на картинке.
Посмотреть вложение 98021
Спасибо за представленное решение! Реализовать решение можно только через цикл? Хотел именно разом использовать нужные строки (т.е. фильтры) для экономии скорости обработки изображений
 

BAZAg

Client
Регистрация
08.11.2015
Сообщения
1 760
Благодарностей
2 398
Баллы
113
Спасибо за представленное решение! Реализовать решение можно только через цикл? Хотел именно разом использовать нужные строки (т.е. фильтры) для экономии скорости обработки изображений
Команды все равно будут выполняться по очереди - не важно в цикле или нет.
Благодаря тому, что в цикле будете выполнять - то сможете в процессе нагенерировать разных последовательностей - всегда на выходе что-то другое будет :-)
Да и в целом, решение о котором я говорю - вполне корректное (сам подобные использую).
Сейчас подобную штуку придумываю для обработки ответов пользователям телеграмм бота - там также подобный подход нужно применять.

А если уж сильно хочется от циклов избавиться - то можно использовать паттерн состояние (описать интерфейс, для каждого фильтра создать отдельный класс, и уже потом дергать рекурсивно фильтры в зависимости от состояния).
Но, все это не так просто, как выглядит - так как при работе с изображениями нужно быть уверенным, что память освобождается и дополнительные знания нужны как это реализовать.
Из-за чего - рекомендую просто взять вариант, который описал я выше, дополнить его списком своих фильтров, которые будут дёргаться - и использовать - и уже сегодня шаблон будет работать.
 
  • Спасибо
Реакции: bizzon, djaga и dizellbtt

dizellbtt

Client
Регистрация
08.01.2021
Сообщения
8
Благодарностей
1
Баллы
3
Команды все равно будут выполняться по очереди - не важно в цикле или нет.
Благодаря тому, что в цикле будете выполнять - то сможете в процессе нагенерировать разных последовательностей - всегда на выходе что-то другое будет :-)
Да и в целом, решение о котором я говорю - вполне корректное (сам подобные использую).
Сейчас подобную штуку придумываю для обработки ответов пользователям телеграмм бота - там также подобный подход нужно применять.

А если уж сильно хочется от циклов избавиться - то можно использовать паттерн состояние (описать интерфейс, для каждого фильтра создать отдельный класс, и уже потом дергать рекурсивно фильтры в зависимости от состояния).
Но, все это не так просто, как выглядит - так как при работе с изображениями нужно быть уверенным, что память освобождается и дополнительные знания нужны как это реализовать.
Из-за чего - рекомендую просто взять вариант, который описал я выше, дополнить его списком своих фильтров, которые будут дёргаться - и использовать - и уже сегодня шаблон будет работать.
Спасибо за быстрый и развёрнутый ответ. Очень помогли в решении проблемы. Если в процессе творчества еще возникнут вопросы по программе - обращусь к вам уже с платной консультацией (подсмотрел на Кворке). Всего доброго!
 
  • Спасибо
Реакции: BAZAg

dizellbtt

Client
Регистрация
08.01.2021
Сообщения
8
Благодарностей
1
Баллы
3
Благодаря тому, что в цикле будете выполнять - то сможете в процессе нагенерировать разных последовательностей - всегда на выходе что-то другое будет
Как раз это и планирую реализовать. В результате перебора 9 вариаций получил 360к+ комбинаций. Задумался как бы не делать кубик для каждой)))
 

BAZAg

Client
Регистрация
08.11.2015
Сообщения
1 760
Благодарностей
2 398
Баллы
113
Как раз это и планирую реализовать. В результате перебора 9 вариаций получил 360к+ комбинаций. Задумался как бы не делать кубик для каждой)))
Допустим у Вас 9 фильтров - вот такой строкой генерируем всегда новые варианты.
Если больше - тогда добавляем ещё буквы.
И глядишь, что-то да с этого получится.
Если нужно чтобы фильтры дублировались - тогда просто строчку дублируем два (нужное количество раз) раза - "123456789123456789";
C#:
string filter = new string("123456789".ToCharArray().Shuffle().ToArray());
return filter.Remove(5);// сколько фильтров применять
 
  • Спасибо
Реакции: dizellbtt

dizellbtt

Client
Регистрация
08.01.2021
Сообщения
8
Благодарностей
1
Баллы
3
Допустим у Вас 9 фильтров - вот такой строкой генерируем всегда новые варианты.
Если больше - тогда добавляем ещё буквы.
И глядишь, что-то да с этого получится.
Если нужно чтобы фильтры дублировались - тогда просто строчку дублируем два (нужное количество раз) раза - "123456789123456789";
C#:
string filter = new string("123456789".ToCharArray().Shuffle().ToArray());
return filter;
Спасибо вам огромное, даже в этом моменте помогли. Я до этого нашел снипет с данным кодом, тоже хотел его так использовать, но мне нужны все вариации перестановок используя от одного до максимального кол-ва цифр(Примеры: 1, 12, 1478 ) с разными вариантами ротаций. Пока только додумался прописать вариации с уникальными цифрами, прогнать через данный снипет и записать в файл, потом случайно дёргать строки
 

dizellbtt

Client
Регистрация
08.01.2021
Сообщения
8
Благодарностей
1
Баллы
3
Спасибо вам огромное, даже в этом моменте помогли. Я до этого нашел снипет с данным кодом, тоже хотел его так использовать, но мне нужны все вариации перестановок используя от одного до максимального кол-ва цифр(Примеры: 1, 12, 1478 ) с разными вариантами ротаций. Пока только додумался прописать вариации с уникальными цифрами, прогнать через данный снипет и записать в файл, потом случайно дёргать строки
 

Кто просматривает тему: (Всего: 1, Пользователи: 0, Гости: 1)