Изменение размера матрицы байтов - C#

Узнай цену своей работы

Формулировка задачи:

Помогите пожалуйста разобраться. Ниже приведена функция перевода матрицы байтов в изображение bitmap. Мне необходимо каждый элемент разместить 169 раз. Т.е. каждый пиксел на картинке увеличиться на 13x13, соответственно увеличиться и разрешение картинки.
public unsafe static Bitmap RgbToBitmap(byte[, ,] rgb)
        {
            int width = rgb.GetLength(2),
                height = rgb.GetLength(1);
            Bitmap result = new Bitmap(width, height, PixelFormat.Format24bppRgb);
            BitmapData bd = result.LockBits(new Rectangle(0, 0, width*2, height*2), ImageLockMode.WriteOnly,
                PixelFormat.Format24bppRgb);
 
            try
            {
                byte* curpos;
                for (int h = 0; h < height; h++)
                {
                    curpos = ((byte*)bd.Scan0) + h * bd.Stride;
                    for (int w = 0; w < width; w++)
                    {
                        *(curpos++) = rgb[2, h, w]; //color B
                        *(curpos++) = rgb[1, h, w]; //color G
                        *(curpos++) = rgb[0, h, w]; //color R
                    }
                }
            }
            finally
            {
                result.UnlockBits(bd);
            }
            return result;
        }

Решение задачи: «Изменение размера матрицы байтов»

textual
Листинг программы
public unsafe static Bitmap RgbToBitmapQ(byte[, ,] rgb)
        {
            if ((rgb.GetLength(0) != 3))
            {
                throw new ArrayTypeMismatchException("Size of first dimension for passed array must be 3 (RGB components)");
            }
 
            int width = rgb.GetLength(2),
                height = rgb.GetLength(1);
 
            Bitmap result = new Bitmap(width, height, PixelFormat.Format24bppRgb);
 
            BitmapData bd = result.LockBits(new Rectangle(0, 0, width, height), ImageLockMode.WriteOnly,
                PixelFormat.Format24bppRgb);
 
            try
            {
                byte* curpos;
                fixed (byte* _rgb = rgb)
                {
                    byte* _r = _rgb, _g = _rgb + 1, _b = _rgb + 2;
                    for (int h = 0; h < height; h++)
                    {
                        curpos = ((byte*)bd.Scan0) + h * bd.Stride;
                        for (int w = 0; w < width; w++)
                        {
                            *(curpos++) = *_b; _b += 3;
                            *(curpos++) = *_g; _g += 3;
                            *(curpos++) = *_r; _r += 3;
                            //c = Color.FromArgb(*_r, *_g, *_b); неверно
                        }
                    }
                }
            }
            finally
            {
                result.UnlockBits(bd);
            }
 
            return result;
        }

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

11   голосов , оценка 3.545 из 5
Похожие ответы