Как добавить шум к изображению или преобразовать его в 24 бит / с?

#c# #bitmap #noise

#c# #растровое изображение #шум

Вопрос:

Новичку нужна помощь! У меня есть изображение, и мне нужно добавить к нему шум. Я пытался использовать для этого библиотеки AForge, но этот метод работает только с растровыми изображениями 24 бит / с, и после изменения размера я получаю что-то другое. Вопрос в том, как преобразовать растровое изображение в 24 бит / с или как добавить к нему шум? Может быть, есть какие-то библиотеки, чтобы упростить это.

Изменение размера:

 private Image Fit(Image image)
{
    Image img = image;
    if (filepath != null)
    {
        if (img.Width > pictureBox1.Width)
        {
            double op = ((pictureBox1.Width - (pictureBox1.Width % 100)) % 100)   (pictureBox1.Width % 100) * 0.01;
            double percent = img.Width / (pictureBox1.Width * 0.01);
            double temp = ((percent - percent % 100   100) - percent) * pictureBox1.Height * 0.01;

            double height = pictureBox1.Height * 0.01 * ((percent - percent % 100   100) - percent);

            System.Drawing.Size sz = new Size(pictureBox1.Width, (int)height);
            img = resizeImage(img, sz);
        }
        if (img.Height > pictureBox1.Height)
        {
            double percent = img.Height / (pictureBox1.Height * 0.01);
            double temp = ((percent - percent % 100   100) - percent) * pictureBox1.Width * 0.01;

            double width = pictureBox1.Width * 0.01 * ((percent - percent % 100   100) - percent);

            System.Drawing.Size sz = new Size((int)width, pictureBox1.Height);
            img = resizeImage(img, sz);
        }
    }
    return img;
}
  

PS> У меня тип ошибки — система полностью отказывается делить 1 на 100, поэтому мне пришлось умножить 1 на 0,01, иначе я получу 0.

Комментарии:

1. Вы уверены, что ваша ошибка с разделением 1 на 100 не является целочисленной математической задачей? 1/100 = 0, но 1.0 / 100, 1/100.0, (double) 1/100 и т.д. все = 0.01

2. Всякий раз, когда я делал то же самое, я получал 0,01. Это первый раз, когда он отличается

3. Итак, ваша проблема в том, что вы не можете преобразовать изображение в 24 бит / с или что ваше изменение размера не работает?

Ответ №1:

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

 double vscale = 1.0;
double hscale = 1.0;
if (img.Width > pictureBox1.Width)
{
    hscale = (double)pictureBox1.Width/img.Width;
}
if (img.Height > pictureBox1.Height)
{
    vscale = (double)pictureBox1.Height/img.Height;
}
double scale = Math.Min(hscale, vscale);
double width = scale * img.Width;
double height = scale * img.Height;

Size sz = new Size((int)width, (int)height);
img = resizeImage(img, sz)
  

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

Ответ №2:

Не нашел ничего хорошего. Вот как я это решил:

 public void GenerateNoise(Image img, int intense)
        {
            Bitmap finalBmp = img as Bitmap;
            Random r = new Random();
            int width = img.Width;
            int height = img.Height;
            for (int x = 0; x < width; x  )
            {
                for (int y = 0; y < height; y  )
                {
                    int def = r.Next(0, 100);
                    if (def < intense)
                    {
                        int op = r.Next(0, 1);
                        if (op == 0)
                        {
                            int num = r.Next(0, intense);
                            Color clr = finalBmp.GetPixel(x, y);
                            int R = (clr.R   clr.R   num)/2;
                            if (R > 255) R = 255;
                            int G = (clr.G   clr.G   num) / 2;
                            if (G > 255) G = 255;
                            int B = (clr.B   clr.B   num) / 2;
                            if (B > 255) B = 255;
                            Color result = Color.FromArgb(255, R, G, B);
                            finalBmp.SetPixel(x, y, result);
                        }
                        else
                        {
                            int num = r.Next(0, intense);
                            Color clr = finalBmp.GetPixel(x, y);
                            Color result = Color.FromArgb(255, (clr.R   clr.R - num) / 2, (clr.G   clr.G - num) / 2,
                                (clr.B   clr.B - num) / 2);
                            finalBmp.SetPixel(x, y, result);
                        }
                    }
                }
            }

        }
  

Комментарии:

1. Выполнение этого самостоятельно в управляемом коде будет медленным и, вероятно, даст не самые хорошие результаты. Реальная проблема, которую вам следует решить, заключается в том, почему вы не можете получить правильный формат пикселей при изменении размера. Как изменить размер? В коде? Покажите нам код изменения размера!