Метод неправильно возвращает объект изображения c # .Net - PullRequest
0 голосов
/ 20 сентября 2011

У меня проблема с тем, что у меня есть метод, который берет объект Image, обрабатывает его в 1 цветном канале (два других имеют сплошной черный цвет), а затем возвращает новое изображение из процесса.

Теперь проблемаУ меня есть то, что, когда я создаю новое изображение в методе, и я смотрю на объект во время отладки, объект изображения выглядит совершенно нормально.НО, когда я возвращаю его пустому объекту Image, все свойства внутри этого объекта Image показывают «System.ArgumentException»

, вот код этого метода:

    public Image GetRedImage(Image sourceImage)
    {
        using (Bitmap bmp = new Bitmap(sourceImage))
        using (Bitmap redBmp = new Bitmap(sourceImage.Width, sourceImage.Height))
        {
            for (int x = 0; x < bmp.Width; x++)
            {
                for (int y = 0; y < bmp.Height; y++)
                {
                    Color pxl = bmp.GetPixel(x, y);
                    Color redPxl = Color.FromArgb((int)pxl.R, 1, 1);

                    redBmp.SetPixel(x, y, redPxl);
                }
            }
            Image tout = (Image)redBmp;

            return tout;
        }

    }

у кого-нибудь есть идеина что, черт возьми, творится?

большое спасибо.

Ответы [ 3 ]

3 голосов
/ 20 сентября 2011

redBmp избавляется от используемого вами блока, а значение redBmp приведено к типу изображения.сбросьте блок использования для redBmp.

Менно

1 голос
/ 20 сентября 2011

Используя блоки using, вы удаляете изображения, как только покидаете область применения.

попробуйте заменить эти две строки сверху:

using (Bitmap bmp = new Bitmap(sourceImage))
using (Bitmap redBmp = new Bitmap(sourceImage.Width, sourceImage.Height))

на:

Bitmap bmp = new Bitmap(sourceImage);
Bitmap redBmp = new Bitmap(sourceImage.Width, sourceImage.Height);

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

вы, вероятно, можете утилизировать bmp также с использованием, но, конечно, нетобъект redBmp, поскольку вы в основном возвращаете его, так что либо вы клонируете его и возвращаете клон, либо не утилизируете его, либо возвращаете удаленный непригодный объект, как то, что происходит сейчас.

1 голос
/ 20 сентября 2011

Вы завернули redBmp в оператор using, так что его метод Dispose вызывается при выходе из метода.Если вы собираетесь использовать его вне метода (вы разыгрываете его как Image и возвращаете его), вам не следует его утилизировать.

public Image GetRedImage(Image sourceImage)
{
    Bitmap redBmp = null;
    using (Bitmap bmp = new Bitmap(sourceImage))
    {
        redBmp = new Bitmap(sourceImage.Width, sourceImage.Height);
        for (int x = 0; x < bmp.Width; x++)
        {
            for (int y = 0; y < bmp.Height; y++)
            {
                Color pxl = bmp.GetPixel(x, y);
                Color redPxl = Color.FromArgb((int)pxl.R, 1, 1);

                redBmp.SetPixel(x, y, redPxl);
            }
        }
    }

    return redBmp as Image;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...