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

dizellbtt

Client
Регистрация
08.01.2021
Сообщения
11
Реакции
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]

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

Вложения

Последнее редактирование:
А что находится внутри переменной 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
А что находится внутри переменной project.Variables["stroka"].Value?
И что по Вашим предположениям хранится в image.Grayscale(), что Вы решили что это строка, и что нужно её заменить?
В переменной будет находится последовательность фильтров для обработки.
Пример содержания переменной:
image.Grayscale()
image.AutoGamma()
image.Grayscale() - непосредственно сам фильтр
 
В переменной будет находится последовательность фильтров для обработки.
Пример содержания переменной:
image.Grayscale()
image.AutoGamma()
image.Grayscale() - непосредственно сам фильтр
В сообщение выше добавил пример того, как можно организовать ветвление в зависимости от условия.
 
А что находится внутри переменной 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. Чтоб мне не прописывать каждый кубик, я хотел использовать переменные для ротации строк
 
Спасибо, а есть возможность изменять именно последовательность фильтров? Условно у меня есть 4 фильтра. Количество всех возможных вариаций перестановок - 24. Чтоб мне не прописывать каждый кубик, я хотел использовать переменные для ротации строк
Как устроите логику - уже сугубо ваше дело. Можете сделать для себя какие-то обозначения, к примеру, пусть переменная будет выглядеть так:
GR;GA;GR;GR

Далее разбиваете через сплит все эти значения и через цикл применяете необходимые фильтры.
 
  • Спасибо
Реакции: dizellbtt
Спасибо, а есть возможность изменять именно последовательность фильтров? Условно у меня есть 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
Подавайте строку, в месте где нужно огранизовать обработку разными фильтами - дёргайте в цикле по символу - в зависимости от символа - вызывайте нужную обработку.
В зависимости от того какая строка будет подана на вход - будет другая последовательность вызова фильтров.
То что Вы хотите называется конечный автомат (можете погуглить на ютубе) или паттерн состояние State.
Пример обработки, как я это вижу добавил на картинке.
Посмотреть вложение 98021
Спасибо за представленное решение! Реализовать решение можно только через цикл? Хотел именно разом использовать нужные строки (т.е. фильтры) для экономии скорости обработки изображений
 
Спасибо за представленное решение! Реализовать решение можно только через цикл? Хотел именно разом использовать нужные строки (т.е. фильтры) для экономии скорости обработки изображений
Команды все равно будут выполняться по очереди - не важно в цикле или нет.
Благодаря тому, что в цикле будете выполнять - то сможете в процессе нагенерировать разных последовательностей - всегда на выходе что-то другое будет :)
Да и в целом, решение о котором я говорю - вполне корректное (сам подобные использую).
Сейчас подобную штуку придумываю для обработки ответов пользователям телеграмм бота - там также подобный подход нужно применять.

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

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

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