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

Получить часть изображения

13.02.2013, 22:12. Показов 5713. Ответов 13
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Имеется вот такая вот картинка (смотрите ниже), как программно выбирать нужную картинку и зарисовывать её для дальнейшей разработки ? (GDI +)
Миниатюры
Получить часть изображения  
0
Лучшие ответы (1)
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
13.02.2013, 22:12
Ответы с готовыми решениями:

На основе исходного изображения (A) и отфильтрованного фильтром гаусса (B), получить изображения
Подскажите ,запутался немного в bmp файлах. Использовать GraphABS запрещено! На основе исходного изображения (A) и отфильтрованного...

Часть изображения
Есть картинка на которой все буквы, как сделать из неё шрифт? Но чтобы это по прежнему оставались картинка.

Выделить часть изображения
Добрый вечер. Подскажите какими средствами можно выделить часть изображения для дальнейших операций над ним? Т.е. как на сайтах по...

13
Эксперт .NET
 Аватар для kolorotur
17823 / 12973 / 3382
Регистрация: 17.09.2011
Сообщений: 21,261
13.02.2013, 22:36
Не совсем понятно про "выбирать и зарисовывать".
Поясните подробнее, если не сложно.
0
20 / 17 / 0
Регистрация: 15.08.2012
Сообщений: 122
13.02.2013, 22:45  [ТС]
kolorotur, Это объекты игрового мира, которые будут использоваться в Windows Forms. По сути, берется Rectangle к примеру 32х32 и он выбирает нужную часть для зарисовки. При зарисовки нужного кирпичика используется матрица. К примеру:
1212121212
2000000E01
1000003302
2003300001
1P00000002
2112112121, где 0 - пусто, 1 - обычный киприч, 2 - обычный кирпич (др. тип), 3 - уничтожаемый кирпич,
P - игрок, E - враг.
Это можно сказать тоже самое, что проигрывание анимации в 2D (кадр за кадром).
0
Эксперт .NET
 Аватар для kolorotur
17823 / 12973 / 3382
Регистрация: 17.09.2011
Сообщений: 21,261
13.02.2013, 23:10
Понял.
Самый простой способ - нарезать из исходного изображения тайлов, затолкать их в ресурсы программы и каждому тайлу присвоить ключ в соответствии со значением массива.
После этого просто циклом проходимся по массиву и отрисовываем в нужном месте нужную картинку.

Но сперва вопрос: зачем три одинаковых тайла? Я про те, которые с вопросительным знаком.

Добавлено через 4 минуты
Еще вопрос: почему тайлы размером 32х32, а фактическая графика - 30х30 и внизу и справа на два пикселя светлая зона? Это так надо?
0
20 / 17 / 0
Регистрация: 15.08.2012
Сообщений: 122
13.02.2013, 23:27  [ТС]
kolorotur, Это просто пример, сейчас художник рисует объекты игрового мира с разрешением картинки 512х512, где будут присутствовать картинки размером 32х32. Задний фон будет "розовый", где будут планироваться создание прозрачности для объекта. (можете посмотреть пример ниже).
По сути вопроса хочу понять, как отрисовывать нужную картинку и какие эффективные методы прозрачности существуют.
Изображения
 
0
20 / 17 / 0
Регистрация: 15.08.2012
Сообщений: 122
13.02.2013, 23:56  [ТС]
kolorotur, А если картинок будет за 100 и каждую картинку ложить в ресурсы, вы представляете, какая будет сильная загружаемость компьютера. Нет, данный метод, что вы написали выше, не подходит. Лучше всё сделать в одной картинке, которая будет весить от силы 500 кб.
0
Эксперт .NET
 Аватар для kolorotur
17823 / 12973 / 3382
Регистрация: 17.09.2011
Сообщений: 21,261
14.02.2013, 00:08
Цитата Сообщение от darkExpressI2P Посмотреть сообщение
Задний фон будет "розовый", где будут планироваться создание прозрачности для объекта.
С прозрачностью в GDI+ особых проблем нет - можете сразу делать исходную картинку в формате с поддержкой прозрачности (PNG, TIFF и т.д.) и отрисовывать ее - альфа-канал будет правильно обработан.

Цитата Сообщение от darkExpressI2P Посмотреть сообщение
А если картинок будет за 100 и каждую картинку ложить в ресурсы, вы представляете, какая будет сильная загружаемость компьютера. Нет, данный метод, что вы написали выше, не подходит. Лучше всё сделать в одной картинке, которая будет весить от силы 500 кб.
Да не вопрос - я же написал, что это самый простой вариант
Вместо нарезки можно привязать элемент матрицы к определенным координатам исходного изображения и считывать этот регион из исходника.

Вот, попробовал срисовывать из исходника, пользуясь предложенной вами матрицей:


Обратите внимание, что пустые клетки в центре прозрачны - это потому что я их в исходнике изменил на прозрачные. Так что розовые цвета не обязательно использовать.
0
20 / 17 / 0
Регистрация: 15.08.2012
Сообщений: 122
14.02.2013, 00:16  [ТС]
kolorotur, Покажите пожалуйста код программы, интересно посмотреть как вы делали и к тому же, как реализовать прозрачность определенного цвета, в данном случае - розовый. (ведь всё же пригодится в будущем, а то фиг знает, как художник там рисовать будет, может ему удобнее с розовым, ярко-зеленым цветом работать)
0
Эксперт .NET
 Аватар для kolorotur
17823 / 12973 / 3382
Регистрация: 17.09.2011
Сообщений: 21,261
14.02.2013, 01:41
Лучший ответ Сообщение было отмечено как решение

Решение

darkExpressI2P, для примера я немного "ужал" исходное изображение, поудаляв повторяющиеся тайлы и зазоры между ними - так будет проще высчитывать координаты нужных для отрисовки тайлов.
Лучше скажите художнику сразу - никаких зазоров между тайлами!

Название: brock.PNG
Просмотров: 509

Размер: 2.7 Кб

Вот код для отрисовки:
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
47
48
49
50
/* Матрица значений.
 * Каждое значение - это порядковый номер тайла в исходном изображении,
 * считываемом слева направо и сверху вниз, начиная с нуля.
 * Например, для исходника 10х10 тайлов значение 12 означает третий слева тайл во втором ряду сверху:
 * 00 01 02 03 04 05 06 07 08 09
 * 10 11 12 13 14 15 16 17 18 19
 * и так далее.
*/
int[,] field = new int[,]
    {
        { 01, 02, 01, 02, 01, 02, 01, 02, 01, 02 },
        { 02, 00, 00, 00, 00, 00, 00, 07, 00, 01 },
        { 01, 00, 00, 00, 00, 00, 03, 03, 00, 02 },
        { 02, 00, 00, 03, 03, 00, 00, 00, 00, 01 },
        { 01, 08, 00, 00, 00, 00, 00, 00, 00, 02 },
        { 02, 01, 01, 02, 01, 01, 02, 01, 02, 01 }
    };
 
// Размер тайла.
int tileS = 30;
 
// Установка цвета, используемого для прозрачности.
var keyColor = Color.FromArgb(0xFF03E4);
var attr = new ImageAttributes();
attr.SetColorKey(keyColor, keyColor);
 
// Регион для отрисовки.
var dst = new Rectangle(0, 0, tileS, tileS);
 
// Исходное изображение.
var source = Resources.brock;
 
// canvas в данном примере - панель размером 300х180 пикселей (10х6 тайлов 30 пикселей каждый).
using (var gfx = canvas.CreateGraphics()) {
    for (int i = 0; i < field.GetLength(0); i++) {
        for (int j = 0; j < field.GetLength(1); j++) {
            // Координата Х нужного тайла в исходном изображении.
            int srcX = tileS * field[i, j] % source.Width;
 
            // Координата Y нужного тайла в исходном изображении.
            int srcY = tileS * field[i, j] / source.Width;
 
            // Координаты для отрисовки текущего тайла.
            dst.X = j * tileS; dst.Y = i * tileS;
 
            // Отрисовка.
            gfx.DrawImage(source, dst, srcX, srcY, tileS, tileS, GraphicsUnit.Pixel, attr);
        }
    }
}
Результат:


Розовый цвет стал прозрачным за счет небольшого падения в скорости отрисовки, т.к. каждый пиксель розового цвета придется заменять на прозрачный.
Тут уже придется идти на компромисс: либо производительность, либо гибкость.
5
9933 / 2936 / 494
Регистрация: 05.10.2013
Сообщений: 7,978
Записей в блоге: 234
09.04.2016, 12:37
Цитата Сообщение от kolorotur Посмотреть сообщение
Тут уже придется идти на компромисс: либо производительность, либо гибкость.
Интересно, а если использовать WPF вместо WinForms может быть будет быстрее и проще? Вроде WPF использует DirectX
0
Эксперт .NET
 Аватар для kolorotur
17823 / 12973 / 3382
Регистрация: 17.09.2011
Сообщений: 21,261
09.04.2016, 13:52
Цитата Сообщение от 8Observer8 Посмотреть сообщение
а если использовать WPF вместо WinForms может быть будет быстрее и проще?
Проще — это вряд ли
Быстрее в плане производительности — безусловно.

Но автор в самом начале упомянул, что ему надо GDI+, потому все вокруг этого и вертелось.
0
9933 / 2936 / 494
Регистрация: 05.10.2013
Сообщений: 7,978
Записей в блоге: 234
09.04.2016, 15:36
Цитата Сообщение от kolorotur Посмотреть сообщение
Проще — это вряд ли
Можете подробнее написать почему на GDI+ будет проще (скажем, создать 2D игру) чем на WPF?
0
Эксперт .NET
 Аватар для kolorotur
17823 / 12973 / 3382
Регистрация: 17.09.2011
Сообщений: 21,261
09.04.2016, 23:36
Цитата Сообщение от 8Observer8 Посмотреть сообщение
Можете подробнее написать почему на GDI+ будет проще (скажем, создать 2D игру) чем на WPF?
Подробнее, или по крайней мере объективно — скорее всего не могу, так как мнение основано исключительно на личном опыте и незнании/неумении работать с низкоуровневой отрисовкой в WPF.
Надо было написать программу с ручной отрисовкой, попытался сделать это на WPF, просидел пол-дня в доках, пытаясь понять что там куда, в итоге выматерился и забыл до лучших времен, сделав всё на GDI+.
При самообучении на GDI+ таких проблем как-то не наблюдалось
0
9933 / 2936 / 494
Регистрация: 05.10.2013
Сообщений: 7,978
Записей в блоге: 234
09.04.2016, 23:55
Цитата Сообщение от kolorotur Посмотреть сообщение
незнании/неумении работать с низкоуровневой отрисовкой в WPF.
Я пока не смотрел, но вроде бы, насколько я понял, WPF имеет высокоуровневую обёртку над DirectX для 2D рисования и вывода картинок. Надеюсь, у меня руки дойдут до этого проекта-статьи: Writing a Multiplayer Game (in WPF) Может кому-то пригодится, код там граммотно написан.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
09.04.2016, 23:55
Помогаю со студенческими работами здесь

Часть изображения с камеры
Доброго времени суток. Мне нужно взять только часть изображения с камер. В настройках объекта Camera я нашёл свойство Wieport Rect,...

Выделить часть изображения
из имеющегося изображения мне нужно выделить часть в новый Bitmap Bitmap bmp = new Bitmap(image1); Graphics g =...

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

Отрезать часть изображения
Привет! У меня есть изображение. Мне надо от него отрезать часть изображения img.crop(0,0,250,250) Но необходимо чтобы этот вырезанный...

Рисуем часть изображения в память
Друзья встала проблема, никак не могу добится результата. Есть картинка шириной 36 пикселей, высотой кратной 36, пусть будет 1800. Картинка...


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

Или воспользуйтесь поиском по форуму:
14
Ответ Создать тему
Новые блоги и статьи
Реалии
Hrethgir 01.03.2026
Нет, я не закончил до сих пор симулятор. Эта задача сложнее. Не получилось уйти в плавсостав, но оно и к лучшему, возможно. Точнее получалось - но сварщиком в палубную команду, а это значит, в моём. . .
Ритм жизни
kumehtar 27.02.2026
Иногда приходится жить в ритме, где дел становится всё больше, а вовлечения в происходящее — всё меньше. Плотный график не даёт вниманию закрепиться ни на одном событии. Утро начинается с быстрых,. . .
SDL3 для Web (WebAssembly): Сборка SDL3 и Box2D из исходников с помощью CMake и Emscripten
8Observer8 27.02.2026
Недавно вышла версия 3. 4. 2 библиотеки SDL3. На странице официальной релиза доступны исходники, готовые DLL (для x86, x64, arm64), а также библиотеки для разработки под Android, MinGW и Visual Studio. . . .
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru