Модераторы: Daevaorn

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Создание изображения, из чарового массива байтов 
:(
    Опции темы
Goldberg
Дата 26.10.2004, 17:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 122
Регистрация: 3.6.2004

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



Цитата(chipset @ 26.10.2004, 16:59)
Цитата(Goldberg @ 26.10.2004, 05:55)

unsigned char[nSize];

Вообще то это некорректный синтаксис..
unsigned char i[nSize];

Это я просто здесь ошибся.
Я имел ввиду - unsigned char chReadImage[nSize];
--------------------
Вот такая у меня привычка, браться за задание, о выполнение которого я изначально не имею никакого представления.
PM MAIL ICQ   Вверх
Mad
Дата 27.10.2004, 12:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Эксперт
Сообщений: 656
Регистрация: 18.10.2004
Где: Одесса

Репутация: 7
Всего: 19



Цитата(Goldberg @ 26.10.2004, 17:56)

Я имел ввиду - unsigned char chReadImage[nSize];

Все равно не правильно. Локальные переменные и массивы выделяються при компиляции из стека, соответственно динамическое указание размера локального массива приведет к переполнению стека.


--------------------
user posted image
PM MAIL   Вверх
Goldberg
Дата 27.10.2004, 17:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 122
Регистрация: 3.6.2004

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



Странно...
int nSize = nGetBlock * 9375;
unsigned char* chReadImage = new unsigned char[nSize];
Записывается только 4 байта.
--------------------
Вот такая у меня привычка, браться за задание, о выполнение которого я изначально не имею никакого представления.
PM MAIL ICQ   Вверх
Goldberg
Дата 27.10.2004, 21:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 122
Регистрация: 3.6.2004

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



Даже если вот так:
unsigned char* chReadImage = new unsigned char[93750];
Результат отличается от:
unsigned char chReadImage[93750];
Я в функции чтения данных указываю кол-во байт которые нужно читать, а именно:
ReadData(chReadImage, sizeof(chReadImage));
Т.е. получается, что в первом случае sizeof(chReadImage) возвращает размер chReadImage 4.
************************
Сейчас проверил, действительно, sizeof почему-то возвращает - 4.

Это сообщение отредактировал(а) Goldberg - 27.10.2004, 21:37
--------------------
Вот такая у меня привычка, браться за задание, о выполнение которого я изначально не имею никакого представления.
PM MAIL ICQ   Вверх
Mad
Дата 28.10.2004, 12:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Эксперт
Сообщений: 656
Регистрация: 18.10.2004
Где: Одесса

Репутация: 7
Всего: 19



Цитата(Goldberg @ 27.10.2004, 21:30)

Я в функции чтения данных указываю кол-во байт которые нужно читать, а именно:
ReadData(chReadImage, sizeof(chReadImage));

Вот она и читает тебе 4 байта (длина указателя) :)
Код

int nSize = nGetBlock * 9375;
unsigned char* chReadImage = new unsigned char[nSize];
ReadData(chReadImage, nSize);



--------------------
user posted image
PM MAIL   Вверх
Goldberg
Дата 28.10.2004, 14:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 122
Регистрация: 3.6.2004

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



Цитата(Mad @ 28.10.2004, 13:07)
Вот она и читает тебе 4 байта (длина указателя) :)
Код

int nSize = nGetBlock * 9375;
unsigned char* chReadImage = new unsigned char[nSize];
ReadData(chReadImage, nSize);

Да, действительно. Как я сам не догодался.
Спасибо! :)
--------------------
Вот такая у меня привычка, браться за задание, о выполнение которого я изначально не имею никакого представления.
PM MAIL ICQ   Вверх
Goldberg
Дата 30.10.2004, 17:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 122
Регистрация: 3.6.2004

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



Еще вопросик появился)
Код

unsigned char* m_pSummFrame[93750]
...
Тут заполняем m_pSummFrame
...
CImage image;
short int* pBuf;
pBuf =  (short int*)image.GetBits();
memcpy((void*) pBuf, (const void*) m_pSummFrame, nSize); //nSize = 93750

Что в memcpy не правильно?
/////////////////////////////////////
На всякий случай:
CImage::GetBits
Return Value
A pointer to the bitmap buffer. If the bitmap is a bottom-up DIB, the pointer points near the end of the buffer. If the bitmap is a top-down DIB, the pointer points to the first byte of the buffer.
/////////////////////////////////////
Короче говоря, я получаю указатель на буфер, и пытаюсь записать туда все, что находится в m_pSummFrame.

Это сообщение отредактировал(а) Goldberg - 30.10.2004, 19:47
--------------------
Вот такая у меня привычка, браться за задание, о выполнение которого я изначально не имею никакого представления.
PM MAIL ICQ   Вверх
Mad
Дата 30.10.2004, 19:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Эксперт
Сообщений: 656
Регистрация: 18.10.2004
Где: Одесса

Репутация: 7
Всего: 19



Goldberg
Цитата(MSDN)

Note  This method supports only DIB section bitmaps; consequently, you access the pixels of a CImage object the same way you would the pixels of a DIB section. The returned pointer points to the pixel at the location (0, 0).

А у тебя получается не DIB :)
Придется тебе из сумарного массива снова делать HBITMAP, и атачить его к другому CImage.


--------------------
user posted image
PM MAIL   Вверх
Goldberg
Дата 30.10.2004, 20:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 122
Регистрация: 3.6.2004

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



Стоп-стоп. Все у меня ДИБ.)
Код

CImage image;
image.Create(250, 250, 16);
RGBQUAD rgb[4096];
int nColor = 0;
for (nColor = 0; nColor < 4096; nColor++)
        {
 rgb[nColor].rgbBlue = nColor / 16;
 rgb[nColor].rgbGreen = nColor / 16;
 rgb[nColor].rgbRed = nColor / 16;
  }
   short int* pBuf =  (short int*)image.GetBits();
memcpy((void*) &pBuf, (const void*) &m_pSummFrame, (size_t) nSize);
image.SetColorTable(0, 4096, (const RGBQUAD*) &rgb);

   image.Save("C:\\AAAAAA.bmp");

CImage::Create: Creates a DIB section bitmap and attaches it to the previously constructed CImage object.
Добавлено @ 20:11
При получении указателя никаких проблем не возникает.
А вот при попытке записать: Unhandled exception at 0x10216393 (msvcr71d.dll) in Name.exe: 0xC0000005: Access violation reading location 0x00131000.

Это сообщение отредактировал(а) Goldberg - 30.10.2004, 20:04
--------------------
Вот такая у меня привычка, браться за задание, о выполнение которого я изначально не имею никакого представления.
PM MAIL ICQ   Вверх
Goldberg
Дата 31.10.2004, 13:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 122
Регистрация: 3.6.2004

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



Код

unsigned char* m_pSummFrame = new unsigned char[nSize]; //nSize = 93750
short int* pBuf =  (short int*) image.GetBits();
for (int nByte = 0; nByte < nSize; nByte++)
{
 memcpy((void*) &pBuf, (const void*) &m_pSummFrame, (size_t) nByte);
}

Вроде как все начинает работать, но доходит до nByte = 8181, опять возникает описанная мной выше ошибка.
В memcpy третий параметр, это кол-во байтов которые нужно копировать, или это номер байта в m_pSummFrame, который нужно копировать? Везде по разному пишут.
Придерживаюсь второго варианта, хотя бы потому что цикл выполняется 8181 раз, а в первом случае сразу вылетает ошибка. :)
--------------------
Вот такая у меня привычка, браться за задание, о выполнение которого я изначально не имею никакого представления.
PM MAIL ICQ   Вверх
Mad
Дата 31.10.2004, 19:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Эксперт
Сообщений: 656
Регистрация: 18.10.2004
Где: Одесса

Репутация: 7
Всего: 19



Цитата(Goldberg @ 30.10.2004, 20:04)

memcpy((void*) &pBuf, (const void*) &m_pSummFrame, (size_t) nSize);

тут ошибка, надо
Код

memcpy((void*) pBuf, (const void*) m_pSummFrame, (size_t) nSize);


Цитата(Goldberg @ 31.10.2004, 13:04)

В memcpy третий параметр, это кол-во байтов которые нужно копировать, или это номер байта в m_pSummFrame, который нужно копировать? Везде по разному пишут.
Придерживаюсь второго варианта

нетправильно, екокраз первый вариант : кол-во байтов.

И еще один лапсус.
Ты создаеш палитры из 4096 цветов. Хотя у тебя 16 битной изображение, и цветов в нем 65536 соответственно.
К тому же 16,24,32 битные изображения палитру не используют :)


--------------------
user posted image
PM MAIL   Вверх
Goldberg
Дата 31.10.2004, 21:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 122
Регистрация: 3.6.2004

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



1. Хм все равно вылетате та ошибка.
2. Ну тогда должно быть так по идее:
Код

for (int nByte = 0; nByte < nSize; nByte++)
{
 memcpy((void*) pBuf, (const void*) m_pSummFrame[nByte], 1);
}

Но увы не работает. Можно эту операция как-нибудь по другому выполнить, без memcpy? Ну например подобное будет эквивалентом memcpy?:
Код

for (int nByte = 0; nByte < nSize; nByte++)
{
 pBuf = (short*) &m_pSummFrame[nByte];
}


Это сообщение отредактировал(а) Goldberg - 31.10.2004, 22:19
--------------------
Вот такая у меня привычка, браться за задание, о выполнение которого я изначально не имею никакого представления.
PM MAIL ICQ   Вверх
Mad
Дата 1.11.2004, 12:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Эксперт
Сообщений: 656
Регистрация: 18.10.2004
Где: Одесса

Репутация: 7
Всего: 19



Goldberg
Просто напиши
Код

memcpy((void*) pBuf, (const void*) m_pSummFrame, nSize);

без всякого цикла.


--------------------
user posted image
PM MAIL   Вверх
Goldberg
Дата 1.11.2004, 18:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 122
Регистрация: 3.6.2004

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



Ну так нет же... Unhandled exception at 0x10216393 (msvcr71d.dll) in Name.exe: 0xC0000005: Access violation writing location 0x00f6f000. :( Пробовал уже.
Ну так что, без memcpy никак не обойтись?

Это сообщение отредактировал(а) Goldberg - 1.11.2004, 18:11
--------------------
Вот такая у меня привычка, браться за задание, о выполнение которого я изначально не имею никакого представления.
PM MAIL ICQ   Вверх
Mad
Дата 2.11.2004, 11:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Эксперт
Сообщений: 656
Регистрация: 18.10.2004
Где: Одесса

Репутация: 7
Всего: 19



Goldberg
Проблема не memcpy.
без него будет выглядеть так :
Код

for (int nByte = 0; nByte < nSize; nByte++)
{
   pBuf[nByte] = m_pSummFrame[nByte];
}

Но думаю, что ошибку это не уберет :(

[qoute=MSDN]
A pointer to the bitmap buffer. If the bitmap is a bottom-up DIB, the pointer points near the end of the buffer.
[/quote]

Посмотри в дебагере какой у тебя битмап получается top-down или bottom-up, скорей всего проблемма в этом.


--------------------
user posted image
PM MAIL   Вверх
Страницы: (4) Все 1 2 [3] 4 
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

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


 




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


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

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