Модераторы: feodorv, GremlinProg, xvr, Fixin
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Загрузка PCX, выравнивание до слова 
:(
    Опции темы
Fixin
Дата 23.6.2005, 19:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Ёжик
***


Профиль
Группа: Комодератор
Сообщений: 1357
Регистрация: 6.1.2004

Репутация: 8
Всего: 18



Вот код загрузки рсх:
Код
k = 0;
    for (y=0 ; y < yy; y++)
    {
        for (x=0; x < xx;)
        {
            dataByte = raw[k++];
            if((dataByte & 0xC0) == 0xC0)
            {
                runLength = dataByte & 0x3F;
                dataByte = raw[k++];
            }
            else
                runLength = 1;
            while(runLength-- > 0)
                pix[y*xx + x++] = dataByte;
        }
    }
"raw" - указатель на облать памяти, где находятся байты данных рсх-а, а "pix" - новообразуемое прямоуголное изображение. Но "прямоугольное" оно только предполагаемо. Строки в рсх-ах выравнены до слова (2 байта), т.е. есть вероятность нахождения в конце каждой строки одного "лишнего" байта, который нужно пропустить.
1) ГДЕ и КОГДА его надо пропускать? ИЛИ
2) Есть свои загрузчики?

Добавлено @ 19:03
Наверное, это надо в "Общие" отправить.
PM MAIL ICQ   Вверх
_hunter
Дата 23.6.2005, 19:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 8564
Регистрация: 24.6.2003
Где: Europe::Ukraine:: Kiev

Репутация: 13
Всего: 98



есть у меня подозрение что это код загрузки BMP-шника...
тогда у тебя есть реальная длина картинки и, сответственно, в цикле for (x=0; x < xx;) нужно бежать до нее ( умножив на у ) а в конце цикла прибавляеш к индексу 4 - длина строки % 4
кажись все...


--------------------
Tempora mutantur, et nos mutamur in illis...
PM ICQ   Вверх
Earnest
Дата 23.6.2005, 19:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5962
Регистрация: 17.6.2005
Где: Рязань

Репутация: 33
Всего: 183



Вот, может сгодится...
Код древний, поэтому что там к чему - уже не помню, но точно работает, потому как взят из работающей программы

Код

void CPCXReader::DecodeLine8 (std::istream& in, LPBYTE pDst) 
{
    int nLineRemainder = m_Pcxh.bplin * m_Pcxh.plans;  //счетчик числа байтов, к-рые нужно записать в строку
    if (m_nCnt && m_Pcxh.plans!=3)    
   {    //заполняем начало строки данными, оставшимися от предыдущей строки
      int nQBts = min ((int)m_nCnt, nLineRemainder);
      memset (pDst, m_nCur, nQBts);
      pDst += nQBts;
      nLineRemainder -= nQBts;
        m_nCnt -= nQBts;
    }

    //цикл декомпрессии строки растра
    while (nLineRemainder > 0)    
   {  ASSERT (m_nCnt == 0);
      //текущий символ и счетчик повторений
        in.read ((char*)&m_nCur, 1);

        //если текущий символ является счетчиком декомпрессии
        if ((m_nCur & 0xc0) == 0xc0)    
      {    //вычисляем его значение
            m_nCnt = max (1, m_nCur & 0x3f);
            //берем новый байт со следующей позиции файла
           in.read ((char*)&m_nCur, 1);

         int nQBts = min ((int)m_nCnt, nLineRemainder);
         memset (pDst, m_nCur, nQBts);
         pDst += nQBts;
         nLineRemainder -= nQBts;
           m_nCnt -= nQBts;
      }
      else
      {  *pDst++ = m_nCur;
         --nLineRemainder;
      }
    }
}



--------------------
...
PM   Вверх
Fixin
Дата 24.6.2005, 19:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Ёжик
***


Профиль
Группа: Комодератор
Сообщений: 1357
Регистрация: 6.1.2004

Репутация: 8
Всего: 18



Цитата
что это код загрузки BMP-шника...
Нет, точно рсх.
2 Earnest Посмотрим...
PM MAIL ICQ   Вверх
Fixin
Дата 24.6.2005, 20:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Ёжик
***


Профиль
Группа: Комодератор
Сообщений: 1357
Регистрация: 6.1.2004

Репутация: 8
Всего: 18



Вот это, я думаю, мне и поможет:
Код
int nLineRemainder = m_Pcxh.bplin * m_Pcxh.plans;

PM MAIL ICQ   Вверх
Fixin
Дата 25.6.2005, 15:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Ёжик
***


Профиль
Группа: Комодератор
Сообщений: 1357
Регистрация: 6.1.2004

Репутация: 8
Всего: 18



Так там что выравнивается? Строка, после сжатия, или перед?
PM MAIL ICQ   Вверх
_hunter
Дата 25.6.2005, 16:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 8564
Регистрация: 24.6.2003
Где: Europe::Ukraine:: Kiev

Репутация: 13
Всего: 98



явно после


--------------------
Tempora mutantur, et nos mutamur in illis...
PM ICQ   Вверх
cardinal
Дата 25.6.2005, 17:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Инженер
****


Профиль
Группа: Экс. модератор
Сообщений: 6003
Регистрация: 26.3.2002
Где: Германия

Репутация: 1
Всего: 99



Цитата(Fixin @ 23.6.2005, 17:02)
Строки в рсх-ах выравнены до слова (2 байта), т.е. есть вероятность нахождения в конце каждой строки одного "лишнего" байта, который нужно пропустить.

Тогда получается, что кол-во байт в строке четное. Сколько байт на строку считаешь по формуле:
(длина строки в байтах + 1) / 2



--------------------
Немецкая оппозиция потребовала упростить натурализацию иммигрантов
В моем блоге: Разные истории из жизни в Германии

"Познание бесконечности требует бесконечного времени, а потому работай не работай - все едино".  А. и Б. Стругацкие
PM   Вверх
_hunter
Дата 25.6.2005, 17:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 8564
Регистрация: 24.6.2003
Где: Europe::Ukraine:: Kiev

Репутация: 13
Всего: 98



кстати... точно до слова? -- обычно ровняют до двух...


--------------------
Tempora mutantur, et nos mutamur in illis...
PM ICQ   Вверх
Fixin
Дата 26.6.2005, 13:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Ёжик
***


Профиль
Группа: Комодератор
Сообщений: 1357
Регистрация: 6.1.2004

Репутация: 8
Всего: 18



Цитата
кстати... точно до слова? -- обычно ровняют до двух...
Так написано в статьях по рсх-ам...
Цитата
Тогда получается, что кол-во байт в строке четное. Сколько байт на строку считаешь по формуле: (длина строки в байтах + 1) / 2
Нет: либо (длина строки в байтах), если уже четное, либо (длина строки в байтах + 1), если длина нечетная.
Цитата
явно после
Попробую...

Это сообщение отредактировал(а) Fixin - 26.6.2005, 13:17
PM MAIL ICQ   Вверх
cardinal
Дата 26.6.2005, 14:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Инженер
****


Профиль
Группа: Экс. модератор
Сообщений: 6003
Регистрация: 26.3.2002
Где: Германия

Репутация: 1
Всего: 99



Цитата(Fixin @ 26.6.2005, 11:16)
Нет: либо (длина строки в байтах), если уже четное, либо (длина строки в байтах + 1), если длина нечетная.

А разница есть? smile Ты с целыми числами работаешь!

А вообще конечно надо сделать так: (длина строки в байтах + 1) / 2 * 2 (целочисленно)
Но это уже ничем не лучше, чем то, что можно сделать с простым if...


--------------------
Немецкая оппозиция потребовала упростить натурализацию иммигрантов
В моем блоге: Разные истории из жизни в Германии

"Познание бесконечности требует бесконечного времени, а потому работай не работай - все едино".  А. и Б. Стругацкие
PM   Вверх
Fixin
Дата 28.6.2005, 21:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Ёжик
***


Профиль
Группа: Комодератор
Сообщений: 1357
Регистрация: 6.1.2004

Репутация: 8
Всего: 18



Все, загружается. Прямо ни с того, ни с сего... Мистика какая-то smile
PM MAIL ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Системное программирование и WinAPI"
Fixin
GremlinProg
xvr
feodorv
  • Большое количество информации и примеров с использованием функций WinAPI можно найти в MSDN
  • Описание сообщений, уведомлений и примеров с использованием компонент WinAPI (BUTTON, EDIT, STATIC, и т.п.), можно найти в MSDN Control Library
  • Непосредственно, перед созданием новой темы, проверьте заголовок и удостоверьтесь, что он отражает суть обсуждения.
  • После заполнения поля "Название темы", обратите внимание на наличие и содержание панели "А здесь смотрели?", возможно Ваш вопрос уже был решен.
  • Приводите часть кода, в которой предположительно находится проблема или ошибка.
  • Если указываете код, пользуйтесь тегами [code][/code], или их кнопочными аналогами.
  • Если вопрос решен, воспользуйтесь соответствующей ссылкой, расположенной напротив названия темы.
  • Один топик - один вопрос!
  • Перед тем как создать тему - прочтите это .

На данный раздел распространяются Правила форума и Правила раздела С++:Общие вопросы .


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Chipset, Step, Fixin, GremlinProg, xvr. feodorv.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Системное программирование и WinAPI | Следующая тема »


 




[ Время генерации скрипта: 0.0536 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.