@xXNullXx

Почему при добавление объекта класса в list один объект перенимает значение другого?

Доброго времени суток!

Делаю приложение для накладывания фильтров на фото(чисто потренироваться).

Нужно сделать список фильтров с предпросмотром как в инстаграме.
Решил это сделать так: добавляю обработанные объекты класса "Picture"
public class Picture
    {
        public uint Width { get; set; }
        public uint Height { get; set; }

        public Pixel[,] Pixels { get; set; }
    }


в list Pictures
public class FilterExplorer
    {
        private readonly OriginalPicture originalPicture = OriginalPicture.GetInstance(); // Здесь один из ОБ класса "Picture"  каторые не должен меняться в данном классе
        private readonly IFilter halftoneFilter = HalftoneFilter.GetInstance(); // Это об одного из фиитров

        public List<Picture> Pictures { get; private set; } = new List<Picture>(); // Здесь хранятся обработанные картинки и одна НЕ обработанная 

        private FilterExplorer()
        {
            Initialization();
        }
            
        private void Initialization()
        {
            Pictures.Add(originalPicture.Picture); // вот та самая не обработанная картинка 
            Pictures.Add(halftoneFilter.Filtration(originalPicture.Picture)); // и обработанная
        }
    }

Проблема собственно в чем когда я добавляю то первая картинка перенимает значение второго. Причем это происходит до возвращения значения функции "Filtration"
public Picture Filtration(Picture picture)
        {
            for (uint x = 0; x < picture.Width; x++)
            {
                for (uint y = 0; y < picture.Height; y++)
                {
                    double convertedPoint =
                        0.3 * picture.Pixels[x, y].R
                        + 0.59 * picture.Pixels[x, y].G
                        + 0.11 * picture.Pixels[x, y].B;

                    picture.Pixels[x, y].R = convertedPoint;
                    picture.Pixels[x, y].G = convertedPoint;
                    picture.Pixels[x, y].B = convertedPoint;
                }
            }
       
            return picture;
        }
  • Вопрос задан
  • 124 просмотра
Решения вопроса 2
mindtester
@mindtester Куратор тега C#
http://iczin.su/hexagram_48
в методе public Picture Filtration(Picture picture) вы принимаете экземпляр картинки по ссылке (ибо это экземпляр класса, не какой то там int)

обрабатываете его, и его же и возвращаете. вот и весь ответ

что бы реализовать задумку, как вы ее описываете, вам нужно клонировать исходное изображение (создать новый экземпляр того же класса, с таким же содержимым). и только после этого применить обработку, и вернуть клон а не оригинал. это можно сделать в том же методе Filtration. логично создать клон в самом начале метода

ps подробнее тут https://docs.microsoft.com/ru-ru/dotnet/csharp/pro...
Ответ написан
freeExec
@freeExec
Участник OpenStreetMap
когда я добавляю то первая картинка перенимает значение второго.

Фраза не понятна.
Но попробую угадать вашу проблему.
Ваш фильтр не создаёт новую картинку, он меняет значения в исходной. Поэтому в итоге у вас списке два раза один и тот же объект.
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы