Форум программистов, компьютерный форум, киберфорум
C# для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.60/5: Рейтинг темы: голосов - 5, средняя оценка - 4.60
18 / 18 / 5
Регистрация: 18.01.2013
Сообщений: 17

Преобразовать трехмерный массив в коллекцию трехмерных массивов

11.11.2014, 13:11. Показов 980. Ответов 2
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Задача: есть трехмерный массив byte ar[3,w,h]; в котором хранится 3-информация о цвете пиксела (0-R, 1-G, 2-B) w-координата пиксела по Х, h-координата пиксела по У. Необходимо написать функцию которая разбивает этот массив на "блоки" заданного размера int px;(количество пикселей по Х), int py; (количество пикселей по У) и помещает их в коллекцию. Функция принимает также разрешение экрана int w; int h; Листинг привожу ниже. Что не так?

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
//функция нарезки блоков
        public List<byte[, ,]> Divider(int px, int py, int w, int h, byte[,,] ar)
        {
            List<byte[, ,]> Lblocks = new List<byte[, ,]>();
 
            int cpx = (int)(w / px); //количество блоков по х
            int cpy = (int)(h / py); //количество блоков по у
            int xytotal = cpx * cpy; //общее количество правильных блоков
           
            int i = 0;
            int j=0;
            int l=px;
            int m=py;
 
            int ib = 0;
            int jb = 0;
 
            for (int k = 0; k < xytotal; k++)
            {
                ib = 0;
                jb = 0;
                byte[,,] b=new byte[3,px,py];
 
                for (; i < l; i++,ib++)
                {                    
                    for (; j < m; j++, jb++)
                    {
                        b[0, ib, jb] = ar[0, i, j];
                        b[1, ib, jb] = ar[1, i, j];
                        b[2, ib, jb] = ar[2, i, j];                       
                    }
                    
                    jb = 0;
                    j +=px;
                    m += px;
                }
 
                Lblocks.Add(b);
 
                i += px;          
                
            }
            
            return Lblocks;
        }
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
11.11.2014, 13:11
Ответы с готовыми решениями:

Многомерный массив одномерных и трехмерных массивов
Доброго утра! Подскажите, возможно ли объединить такие массивы: //в этот массив string Array = new string { { { ...

Преобразовать шестимерный массив в трехмерный
Заранее спасибо.

Преобразовать двухмерный массив в трехмерный
Есть двухмерный массив a. Необходимо добавить ему еще одну размерность. Как это сделать в рамках функции? void IncreaseField (int **a,...

2
Заблокирован
11.11.2014, 14:39
Ruzhin, покажите на примере, так не понятно, что вы хотите сделать.
0
18 / 18 / 5
Регистрация: 18.01.2013
Сообщений: 17
11.11.2014, 14:58  [ТС]
Глобально задача состоит в создании аналога TeamViewer. Сейчас решаю задачу оптимальной передачи скринов по сети. Идея такова: делаем скриншот, извлекаем информацию о пикселах (цвет, координаты) помещаем это в трехмерный массив. Это я сделал все прекрасно работает. Теперь я хочу разбить этот трехмерный массив на определенное количество маленьких массивов (тоже трехмерных) и поместить их в коллекцию... (это нужно для того чтобы потом отслеживать в каких массивах произошли изменения цвета и отправлять по сети только те массивы которые изменились) Вот код:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
int xc=20; //количество пикселей по Х в блоке
                int yc=20; //количество пикселей по У в блоке
                List<byte[, ,]> L = new List<byte[, ,]>(); //коллекция для хранения нарезанных блоков
 
                int width = System.Windows.Forms.Screen.PrimaryScreen.Bounds.Width; //ширина экрана
                int height = System.Windows.Forms.Screen.PrimaryScreen.Bounds.Height; //высота экрана
 
                //упаковка в байтовыый массив
                Bitmap printscreen = new Bitmap(Screen.PrimaryScreen.Bounds.Width, Screen.PrimaryScreen.Bounds.Height); //делаем снимок экрана            
 
                Graphics graphics = Graphics.FromImage(printscreen as Image); //получаем графикс
                graphics.CopyFromScreen(0, 0, 0, 0, printscreen.Size);
 
 
                printscreen.Save(@"E:\printscreen1.bmp", System.Drawing.Imaging.ImageFormat.Bmp);
                byte[, ,] rgb = BitmapToByteRgb(printscreen);
 
                L = Divider(xc, yc, width, height, rgb); //функция для формирования нарезанных блоков
код функции BitmapToByteRgb(printscreen):
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
public unsafe static byte[, ,] BitmapToByteRgb(Bitmap bmp)
        {
            int width = bmp.Width,
                height = bmp.Height;
            byte[, ,] res = new byte[3, height, width];
            BitmapData bd = bmp.LockBits(new Rectangle(0, 0, width, height), ImageLockMode.ReadOnly,
                PixelFormat.Format16bppRgb555);
            try
            {
                byte* curpos;
                for (int h = 0; h < height; h++)
                {
                    curpos = ((byte*)bd.Scan0) + h * bd.Stride;
                    for (int w = 0; w < width; w++)
                    {
                        res[2, h, w] = *(curpos++);
                        res[1, h, w] = *(curpos++);
                        res[0, h, w] = *(curpos++);
                    }
                }
            }
            finally
            {
                bmp.UnlockBits(bd);
            }
            return res;
        }
А вот код функции Divider (которая не работает):

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
 //функция нарезки блоков
        public List<byte[, ,]> Divider(int px, int py, int w, int h, byte[,,] ar)
        {
            List<byte[, ,]> Lblocks = new List<byte[, ,]>();
 
            int cpx = (int)(w / px); //количество блоков по х
            int cpy = (int)(h / py); //количество блоков по у
            int xytotal = cpx * cpy; //общее количество правильных блоков
           
            int i = 0;
            int j=0;
            int l=px;
            int m=py;
 
            int ib = 0;
            int jb = 0;
 
            for (int k = 0; k < xytotal; k++)
            {
                ib = 0;
                jb = 0;
                byte[,,] b=new byte[3,px,py];
 
                for (; i < l; i++,ib++)
                {                    
                    for (; j < m; j++, jb++)
                    {
                        b[0, ib, jb] = ar[0, i, j];
                        b[1, ib, jb] = ar[1, i, j];
                        b[2, ib, jb] = ar[2, i, j];                       
                    }
                    
                    jb = 0;
                    j +=px;
                    m += px;
                }
 
                Lblocks.Add(b);
               
                i += px;          
                
            }
 
            
            return Lblocks;
        }
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
11.11.2014, 14:58
Помогаю со студенческими работами здесь

Преобразовать массив в коллекцию
Привет! Есть такой не сложный вопрос: имеется двумерный массив myarrat (1,I), нужно вместо этого массива использовать коллекцию! Не...

Дано число R и коллекцию размера N. Преобразовать коллекцию, заменив все ее положительные элементы на число R
Всем доброго времени суток. Вот такая задачка. Дано число R и коллекция размера N. Преобразовать коллекцию, заменив все ее...

Преобразовать трехмерный байтовый массив в одномерный байтовый массив
При запуске функции выдает ошибку: индекс находится за пределами массива. Почему? //преобразование трехмерного массива в одномерный ...

Преобразовать одномерный байтовый массив в трехмерный байтовый массив
При выполнении функции выпадает исключение: &quot;Выдано исключение типа System.OutOfMemoryException&quot; что не так? //преобразование...

Сортировка трехмерных массивов
Привет всем. Кто разбирается и может помочь разобраться и кое-что подправить в прозе с модулями и трехмерными массивами сортировки?


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
3
Ответ Создать тему
Новые блоги и статьи
делаю науч статью по влиянию грибов на сукцессию
anaschu 13.03.2026
прикрепляю статью
SDL3 для Desktop (MinGW): Создаём пустое окно с нуля для 2D-графики на SDL3, Си и C++
8Observer8 10.03.2026
Содержание блога Финальные проекты на Си и на C++: hello-sdl3-c. zip hello-sdl3-cpp. zip Результат:
Установка CMake и MinGW 13.1 для сборки С и C++ приложений из консоли и из Qt Creator в EXE
8Observer8 10.03.2026
Содержание блога MinGW - это коллекция инструментов для сборки приложений в EXE. CMake - это система сборки приложений. Здесь описаны базовые шаги для старта программирования с помощью CMake и. . .
Как дизайн сайта влияет на конверсию: 7 решений, которые реально повышают заявки
Neotwalker 08.03.2026
Многие до сих пор воспринимают дизайн сайта как “красивую оболочку”. На практике всё иначе: дизайн напрямую влияет на то, оставит человек заявку или уйдёт через несколько секунд. Даже если у вас. . .
Модульная разработка через nuget packages
DevAlt 07.03.2026
Сложившийся в . Net-среде способ разработки чаще всего предполагает монорепозиторий в котором находятся все исходники. При создании нового решения, мы просто добавляем нужные проекты и имеем. . .
Модульный подход на примере F#
DevAlt 06.03.2026
В блоге дяди Боба наткнулся на такое определение: В этой книге («Подход, основанный на вариантах использования») Ивар утверждает, что архитектура программного обеспечения — это структуры,. . .
Управление камерой с помощью скрипта OrbitControls.js на Three.js: Вращение, зум и панорамирование
8Observer8 05.03.2026
Содержание блога Финальная демка в браузере работает на Desktop и мобильных браузерах. Итоговый код: orbit-controls-threejs-js. zip. Сканируйте QR-код на мобильном. Вращайте камеру одним пальцем,. . .
SDL3 для Web (WebAssembly): Синхронизация спрайтов SDL3 и тел Box2D
8Observer8 04.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-sync-physics-sprites-sdl3-c. zip На первой гифке отладочные линии отключены, а на второй включены:. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru