![]() |
|
Модераторы: bsa |
![]()
|
|
| kurtis |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 65 Регистрация: 10.8.2007 Репутация: нет Всего: нет |
Пытаюсь развернуть картинку на 90 градусов, в итоге, вместо картинки, получаю непонятный мусор. Исходное изображение 8-ми битное, разрешение 600 на 800 пикселей.
Вот моя функция разворота (пожалуйста, не обращайте внимание на оптимальность алгоритма, код сырой)
В приложении исходник полностью, но не уверен что соберется не под Линукс. Тестовое изображение можно взять здесь (Дропбокс, 500 кб) То что получается лежит здесь (Дропбок, 20кб) Нужно чтоб получилось изображение повернутое на 90 градусов. Общий смысл действий Есть последовательность байт, которая в зависимости от заголовка, интерпретируется особым образом. В моем случае, имеется изображение, размером 600 на 800 пикселей, 8 бит на цвет. Программа пытается сделать поворот, т.е. "певращение" столбцов в исходном изображении, в строки в перевернутом (или наоборот). Посмотрите пожалуйста на код, может увидите откровенные ляпы, а то у меня уже от этой задачи немного крыша едет, не могу понять где я не правильно делают. Спасибо. P.S. Исходник не получилось прикрепить, закинул его на дропбокс |
|||
|
||||
| Estranged |
|
|||
|
Бывалый ![]() Профиль Группа: Участник Сообщений: 158 Регистрация: 30.8.2010 Репутация: нет Всего: 3 |
Функция правильная. Картинка точно на 8 бит?
|
|||
|
||||
| kurtis |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 65 Регистрация: 10.8.2007 Репутация: нет Всего: нет |
точно
размер 480000 байт, это 1 байт (8 бит) * 600 * 800. Именно с этой областью я и работаю. |
|||
|
||||
| math64 |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2505 Регистрация: 12.4.2007 Репутация: 12 Всего: 72 |
Код использует возможности C, которых нет в C++ (динамические массивы), поэтому не будет компилироаваться в C++ или компиляторами С, не поддерживающими динамические массивы.
Можно переписать так:
|
|||
|
||||
| kurtis |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 65 Регистрация: 10.8.2007 Репутация: нет Всего: нет |
Спасибо за предложенный вариант алгоритма, но результат его работы аналогичен приведенному мной.
Видимо проблема где-то в интерпретации данных bmp файла. |
|||
|
||||
| borisbn |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 4875 Регистрация: 6.2.2010 Где: Ростов-на-Дону Репутация: 21 Всего: 135 |
Может быть... Попробуй сохранить BMP без поворота. Т.е. считать, разобрать по структурам и сохранить. Получаешь исходную картинку ? Добавлено через 1 минуту и 28 секунд Может у тебя установлено выравнивание структур на 4 (или 8) байт ? Тогда понятно. Нужно делать на 1 байт -------------------- Женщины отличаются от программистов тем, что у них чары состоят из стрингов |
|||
|
||||
| math64 |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2505 Регистрация: 12.4.2007 Репутация: 12 Всего: 72 |
Мой вариант делает ровно то же, что и Ваш, но будет компилироваться под C++. Возможно, Вы не оттуда выбираете данные из bmp, В начале идёт заголовок, за ним (при 8-битном изображении) - палитра, и только потом данные, причем сначала нижние строчки. Если строка нечётной длины (не Ваш случай) - добавляется лишний байт для выравнивания.
|
|||
|
||||
| kurtis |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 65 Регистрация: 10.8.2007 Репутация: нет Всего: нет |
md5 хэш полученного изображения полностью совпадает с исходным. А можно про установку выравнивания немного по подробнее? Из того что я читал, то нужно делать строки кратными 4-м, но в моем случае, это не должно играть особой роли т.к. оба разрешения (исходного и перевернутое) кратны 4-м. |
|||
|
||||
| borisbn |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 4875 Регистрация: 6.2.2010 Где: Ростов-на-Дону Репутация: 21 Всего: 135 |
имеется в виду не выравнивание строк изображения, а выравнивание структур в исходном коде. Не знаю, как в линуксе, а в MSVC это делается так
Попробуй, может и для gcc прокатит -------------------- Женщины отличаются от программистов тем, что у них чары состоят из стрингов |
|||
|
||||
| kurtis |
|
||||||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 65 Регистрация: 10.8.2007 Репутация: нет Всего: нет |
На первый взгляд все правильно, т.е. получается получить изображение идентичное исходному. Проблема именно в преобразовании (по крайне мере, мне так кажется). Добавлено через 6 минут и 26 секунд А, я понял. В GCC есть
Спасибо, попробую, хотя не совсем понимаю как это может влиять. |
||||||
|
|||||||
| xvr |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 7046 Регистрация: 28.8.2007 Где: Дублин, Ирландия Репутация: 35 Всего: 223 |
||||
|
||||
| kurtis |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 65 Регистрация: 10.8.2007 Репутация: нет Всего: нет |
image это двоичные данные, которые интерпретируются в зависимости от заголовка, а в заголовке разрешение я меняю.
|
|||
|
||||
| math64 |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2505 Регистрация: 12.4.2007 Репутация: 12 Всего: 72 |
Можете попробовать для начала более простые преобразования - например инверсию цвета пикселей. Для проверки, что Вы правильно его находите в bmp.
|
|||
|
||||
| borisbn |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 4875 Регистрация: 6.2.2010 Где: Ростов-на-Дону Репутация: 21 Всего: 135 |
sizeof( ваша_структура_заголовка_BMP ) будет отличаться от той, которая записана в файле из-за выравнивания, поэтому структуры должны быть packed инверсия цвета в 8-битном BMP - это не совсем простое преобразование. вернее, это не касается самого изображения, а меняется только таблица цветов -------------------- Женщины отличаются от программистов тем, что у них чары состоят из стрингов |
|||
|
||||
| kurtis |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 65 Регистрация: 10.8.2007 Репутация: нет Всего: нет |
Фух. Получилось.
Правда переделал через одномерный массив. Осталось только понять где накосячил с двухмерными массивами.
Всем спасибо за помощь и моральную поддержку! |
|||
|
||||
| borisbn |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 4875 Регистрация: 6.2.2010 Где: Ростов-на-Дону Репутация: 21 Всего: 135 |
Проблема была в этом
Ты считал, что у исходного изображения x_size строк и y_size столбцов, а это правда не для исходного, а для повёрнутого изображения. http://liveworkspace.org/code/aec2e27ad13a...2d67b7cbc80b80a -------------------- Женщины отличаются от программистов тем, что у них чары состоят из стрингов |
|||
|
||||
![]()
|
| Правила форума "C/C++: Для новичков" | |
|
|
Запрещается! 1. Публиковать ссылки на вскрытые компоненты 2. Обсуждать взлом компонентов и делиться вскрытыми компонентами
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | C/C++: Для новичков | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |