работа с графикой на С |
1. Пользуйтесь тегами кода. - [code] ... [/code]
2. Точно указывайте язык, название и версию компилятора (интерпретатора).
3. Название темы должно быть информативным.
В описании темы указываем язык!!!
Наладить общение поможет, если вы подпишитесь по почте на новые темы в этом форуме.
работа с графикой на С |
Tan |
Сообщение
#1
|
Профи Группа: Пользователи Сообщений: 559 Пол: Мужской Реальное имя: Бруно Репутация: 10 |
Доброго времени суток. Моя цель : необходимо написать функцию, в которую передаются 5 параметров, первые 4 - координаты изображения, выведенного на экране, последний параметр H - это целое число. Требуется поделить изображение на Н одинаковых квадратов, после чего вывести их в определённом порядке в том же месте, где была изначальная картинка (это часть одной большой задумки). Вероятней всего наиболее удобно будет использовать одномерный массив из Н элементом, состоящих из структуры, которая хранит координаты каждого из маленьких квадратиков, а так же саму маленькую картинку. Вот, с релизацией возникли проблемки. Теперь начну сначала, и первый вопрос : как продефинировать вышеописанную структуру? (с коордианатами ясно, а вот как запихнуть туда ячейку в которой будет хранится небольшое изображение, которое занесётся в память, например, тем же getimage) Спасибо.
-------------------- Цитата Imagination is more important than knowledge. Albert Einstein |
volvo |
Сообщение
#2
|
Гость |
typedef (координаты правого нижнего угла хранить не обязательно - они будут содержатся в данных, получаемых getimage) |
Tan |
Сообщение
#3
|
Профи Группа: Пользователи Сообщений: 559 Пол: Мужской Реальное имя: Бруно Репутация: 10 |
Cпасибо, начну реализовывать, если появятся вопросы, отпишусь.
-------------------- Цитата Imagination is more important than knowledge. Albert Einstein |
Tan |
Сообщение
#4
|
Профи Группа: Пользователи Сообщений: 559 Пол: Мужской Реальное имя: Бруно Репутация: 10 |
Появился следующий вопрос. Допустим на экран выведена картинка плотностью 256 цветов. Занесёт ли getimage в память участок картинки такой плотностью без потерь красок?
-------------------- Цитата Imagination is more important than knowledge. Albert Einstein |
volvo |
Сообщение
#5
|
Гость |
А функции getimage все равно, сколько у тебя цветов... Она просто
Цитата(help) saves a bit image of the specified region into memory ... Если восстанавливать будешь в том же видеорежиме - получишь то же изображение... |
Tan |
Сообщение
#6
|
Профи Группа: Пользователи Сообщений: 559 Пол: Мужской Реальное имя: Бруно Репутация: 10 |
Понятно, просто возникла проблема, что putimage выводит ухудшенное изображение, наверно где - то неуловил переход видеорежимов. Здесь прикрплён проект. При запуске, когда появится меню, на кнопке старт при нажатии ентер программа считывает бмп файл, потом вырезает его маленький левый верхний кусочек и выводит его. Но выводит его как я уже отписал ухудшенно. Посмотрите пожалуйста, просто насколько я заметил считывание в память и вывод происходят в одном видеорежиме.
-------------------- Цитата Imagination is more important than knowledge. Albert Einstein |
volvo |
Сообщение
#7
|
Гость |
Я вообще не понимаю, как твоя программа могла работать... Память-то под буфер ты не выделил... Вот так (здесь нет всех необходимых проверок, это просто пример) попробуй:
void imrand (x1, x2, y1, y2, n) { |
Tan |
Сообщение
#8
|
Профи Группа: Пользователи Сообщений: 559 Пол: Мужской Реальное имя: Бруно Репутация: 10 |
Про сторону - это я в будущем буду использовать, чтобы разделить картинку на равные элементы - квадраты. Спасибо за подсказку, сейчас буду разбираться. Да, всё работает, огромное спасибо, я как - то и упустил, что надо память выделять, думал, что этот процесс автоматизирован.
Сообщение отредактировано: Tan - -------------------- Цитата Imagination is more important than knowledge. Albert Einstein |
Tan |
Сообщение
#9
|
Профи Группа: Пользователи Сообщений: 559 Пол: Мужской Реальное имя: Бруно Репутация: 10 |
У меня снова новый вопрос по данной теме Имеется структура, которую помог описать volvo :
typedef Ситуация следующая : в процедуру отсылается занчение (допустим n). После этого необходимо создать двумерный массив из элементов структуры IMAGEPART n X n. То есть по идее IMAGEPART arr[n][n];, но компилятор ругается и, насколько я понял, хочет видеть там константые величины, как быть ? При чём заведомо известно, что 1 < n < 5. По идее можно создать 5 массивов и кейсом, в зависимости от n выбрать тот, с которым будет работа, или как в паскале, описать максимально - возможный массив, но работать только с частью (не нравится этот вариант), но возможно есть что - то по логичнее или проще. Спасибо. -------------------- Цитата Imagination is more important than knowledge. Albert Einstein |
volvo |
Сообщение
#10
|
Гость |
Цитата возможно есть что - то по логичнее или проще Логичнее - динамически выделять память под матрицу: IMAGEPART **arr; |
Tan |
Сообщение
#11
|
Профи Группа: Пользователи Сообщений: 559 Пол: Мужской Реальное имя: Бруно Репутация: 10 |
Понятно. Допустим, уже известно число n (тут оно уже K ). Я пытался дописать процедуру так, чтобы всё считалось в структуру и потом так же вывелось обратно, вот что я нахимичил, но это всё выводит только первый кусочек, что же не так ? :
IMAGEPART picturemas[K][K]; -------------------- Цитата Imagination is more important than knowledge. Albert Einstein |
volvo |
Сообщение
#12
|
Гость |
Я так и не понял логику твоей программы, но смотри:
... Вот у меня со значением a = 20 все отработало, а при a = 50 уже программа стала вылетать, по нехватке памяти... Возможно придется перейти в другую модель памяти, возможно - farmalloc вместо malloc спасет ситуацию, но сейчас сам каркас рабочий... |
Tan |
Сообщение
#13
|
Профи Группа: Пользователи Сообщений: 559 Пол: Мужской Реальное имя: Бруно Репутация: 10 |
Спасибо! Я продолжаю разбираться!
-------------------- Цитата Imagination is more important than knowledge. Albert Einstein |
Tan |
Сообщение
#14
|
Профи Группа: Пользователи Сообщений: 559 Пол: Мужской Реальное имя: Бруно Репутация: 10 |
Странно получается, данная процедура в конце концов выводит не всё изображение, а только его часть. Кстати, а почему вы взяли сторону именно за 20 ? Для проверки ? Просто, чтобы картинка осталось прежней по размеру вероятно надо взять сторону за (x2 - x1) * (y2 - y1) / (k * k). При чём в таком случае всё равно результирующая картинка маленькая (что - то я опять перемудрил наверно).
-------------------- Цитата Imagination is more important than knowledge. Albert Einstein |
volvo |
Сообщение
#15
|
Гость |
Цитата данная процедура в конце концов выводит не всё изображение, а только его часть Естественно... Я же сказал, что делалась попытка сохранить 5*5 квадратных фрагментов изображения размером 20*20 пикселей, то есть всего - кусок картинки 100*100... При больших размерах программа выходит с нехваткой памяти...Цитата чтобы картинка осталось прежней по размеру взять сторону за (x2 - x1) * (y2 - y1) / (k * k) А с чего ты взял, что при разбивке на одинаковые части прямоугольного изображения у тебя получатся квадраты?Надо вычислять не одну сторону, а 2. Ширину фрагмента делать: (x2 - x1) / k, а его высоту - (y2 - y1) / k, причем при вызове функции в качестве x1, y1, x2, y2 передавать координаты начала/конца изображения, а не 50/80 как у тебя сейчас... |
Tan |
Сообщение
#16
|
Профи Группа: Пользователи Сообщений: 559 Пол: Мужской Реальное имя: Бруно Репутация: 10 |
Я почему - то возомнил, что моё изображение это большой квадрат (сам не знаю почему). Ваши комментарии абсолютно точны, сейчас изменяю процедуру.
-------------------- Цитата Imagination is more important than knowledge. Albert Einstein |
Tan |
Сообщение
#17
|
Профи Группа: Пользователи Сообщений: 559 Пол: Мужской Реальное имя: Бруно Репутация: 10 |
Вот, используя все ваши замечания я немного изменил функцию, но в таком случае ничего не выводится кроме чёрного экрана, хотя вроде программа не виснет ( K = 5; n = 5; );
IMAGEPART picturemas[K][K]; Сообщение отредактировано: Tan - -------------------- Цитата Imagination is more important than knowledge. Albert Einstein |
volvo |
Сообщение
#18
|
Гость |
Чему равно K?
(Программа и не будет виснуть, она просто завершится при невозможности выделения памяти и все... Кстати, зачем ты удалил проект? Как теперь я могу проверить работу твоей функции?) |
Текстовая версия | 11.01.2025 16:33 |