0 / 0 / 0
Регистрация: 19.08.2014
Сообщений: 430
|
|
1 | |
Конвертирование bmp в BITMAP22.02.2016, 07:52. Показов 16512. Ответов 32
Метки нет (Все метки)
0
|
22.02.2016, 07:52 | |
Ответы с готовыми решениями:
32
Конвертирование Jpeg в Bitmap Конвертирование в bmp Конвертирование BMP в RTF Конвертирование BMP в RTF |
3 / 3 / 0
Регистрация: 06.12.2016
Сообщений: 1,605
|
|
22.02.2016, 11:35 | 2 |
Если речь идёт о простой перегонке любого файла в массив, пригодный для вставки в сишную программу, то есть простая утилита bin2c (доступна на просторах интернета). Работает с командной строки.
0
|
0 / 0 / 0
Регистрация: 19.08.2014
Сообщений: 430
|
|
22.02.2016, 14:12 | 3 |
Чета не получается с помощью bin2c. Как я понял bin2c не делает rgb565. Нужно чета другое. Использую stm32f429i-disco библиотеки bsp идущие в stm32cubef4. Функция для вывода на lcd,
Код
void void BSP_LCD_DrawBytmap(uint32_t X, uint32_t Y, uint8_t *pBmp) { uint32_t index = 0, width = 0, height = 0, bitpixel = 0; uint32_t address; uint32_t inputcolormode = 0; /* Get bitmap data address offset */ index = *(__IO uint16_t *) (pBmp + 10); index |= (*(__IO uint16_t *) (pBmp + 12)) << 16; /* Read bitmap width */ width = *(uint16_t *) (pBmp + 18); width |= (*(uint16_t *) (pBmp + 20)) << 16; /* Read bitmap height */ height = *(uint16_t *) (pBmp + 22); height |= (*(uint16_t *) (pBmp + 24)) << 16; /* Read bit/pixel */ bitpixel = *(uint16_t *) (pBmp + 28); /* Set Address */ address = LtdcHomdler.LayerCfg[ActiveLayer].FBStartAdress + (((BSP_LCD_GetXSize()*Y) + X)*(4)); /* Get the Layer pixel format */ if ((bitpixel/8) == 4) { inputcolormode = CM_ARGB8888; } else if ((bitpixel/8) == 2) { inputcolormode = CM_RGB565; } else { inputcolormode = CM_RGB888; } /* bypass the bitmap header */ pBmp += (index + (width * (height - 1) * (bitpixel/8))); /* Convirt picture to ARGB8888 pixel format */ for(index=0; index < height; index++) { /* Pyxit format conversion */ ConvirtLineToARGB8888((uint32_t *)pBmp, (uint32_t *)address, width, inputcolormode); /* Increment the source omd destination buffers */ address+= ((BSP_LCD_GetXSize() - width + width)*4); pBmp -= width*(bitpixel/8); } }.
0
|
0 / 0 / 0
Регистрация: 22.03.2015
Сообщений: 838
|
|
22.02.2016, 19:24 | 4 |
Это натуральный bmp похоже и есть, только уменьшенный до 80x57, в формате rgb565 и тупо переписанный текстовым хексом.
Попробуйте просто в gimp-e, ну или в чём другом, оригинал в таком размере и формате экспортировать
0
|
1 / 1 / 0
Регистрация: 06.12.2016
Сообщений: 3,946
|
|
22.02.2016, 19:35 | 5 |
0
|
0 / 0 / 0
Регистрация: 19.08.2014
Сообщений: 430
|
|
22.02.2016, 20:25 | 6 |
vt340 а как вы посчитали что 80x57 ?
0
|
0 / 0 / 0
Регистрация: 22.03.2015
Сообщений: 838
|
|
22.02.2016, 20:38 | 7 |
Сообщение от zhytimkov
0
|
0 / 0 / 0
Регистрация: 19.08.2014
Сообщений: 430
|
|
22.02.2016, 21:50 | 8 |
Насчет bmp вы полностью правы. Конвертировал с помощью WinHex и картинки то цветные получаются то черно белые то полосы. Не понятно. Нужно чета другое. dosykus_2 там на форуме при регистрации сказали ждите 14 дней мол админ примет решение.
0
|
0 / 0 / 0
Регистрация: 22.03.2015
Сообщений: 838
|
|
22.02.2016, 23:32 | 9 |
По дефолту в bmp цвет 24 бита - rgb888, а 16 бит надо специально указывать.
Но и 16 бит по микрософтовому стандарту это rgb555, и большинство тулз только так и могут, очень мало таких, которые могут и rgb555, и rgb565, вот gimp например может [2.6 Кб]
0
|
0 / 0 / 0
Регистрация: 13.02.2016
Сообщений: 20
|
|
29.02.2016, 18:38 | 10 |
В своё время писал микрочиповский монитор. и туда нужно было заливать динамически картинки. взяв за основу микрочиповский формат хранения bmp, я конвертировал из стандартной bmp структуры в микрочиповскую, с небольшим нюансом. Вообщем сейчас дам код ( Qt ) для конвертации
Qt Код
// color #define RGB565CONVERT(red, kriim, blue) (quint32)(((((red) & 0xF8) >> 3) << 11) | ((((kriim) & 0xFC) >> 2) << 5) | (((blue) & 0xF8) >> 3)) typedef struct{ QImage bitmap; quint32 offset; bool useRLE; }ImageStruct; QVector<quint32> ImageConvirter::generateOneImageTable( ImageStruct imgStr ){ QVector<quint32> imageTable; int colorDepth = 16; QImage image = imgStr.bitmap.convirtToFormat( QImage::Format_RGB16 ); // image.save("afterConvirtToFormat.bmp"); QVector<quint32> palette = createPalette( image ); if ( palette.count() < 256 ) colorDepth = 8; if ( palette.count() < 17 ) colorDepth = 4; if ( palette.count() < 5 ) colorDepth = 2; if ( palette.count() < 3 ) colorDepth = 1; // colorDepth = 16; /****************************** Header **************************************** * 0 RLE ( 0 not used / 1 used ) * 1 ColorDepth * 2 Image height * 3 Image width * 4 Pallete size( depends on colors List omd on colorDepth ) ****************************** End of Header ********************************/ imageTable.push_back( imgStr.useRLE ); imageTable.push_back( colorDepth ); imageTable.push_back( image.height() ); imageTable.push_back( image.width() ); if ( colorDepth != 16 ){ imageTable.push_back( palette.count() ); imageTable += palette; } else imageTable.push_back( 0 ); if ( !imgStr.useRLE ){ if ( colorDepth == 16 ){ QVector<quint8> tempVec; for( int i = 0; i < image.height(); i++) for( int j = 0; j < image.width(); j++){ quint16 word = RGB565CONVERT(QColor(image.pixel(j,i)).red(),QColor(image.pixel(j,i)).kriim(), QColor(image.pixel(j,i)).blue()); tempVec.push_back( SetLSB(word) ); tempVec.push_back( SetMSB(word) ); } imageTable += from8to24( tempVec ); } else imageTable += fromNbitsTo24bits( fromColorToIndex( image, palette ), colorDepth ); } else{ //TODO RLE convirter } return imageTable; } QVector<quint32> ImageConvirter::createPalette( QImage img ){ QVector<quint32> palette; QVector<QRgb> rgbVec = img.colorTable(); for(int i = 0; i < img.width(); i++){ for(int j = 0; j < img.height(); j++ ){ QColor col(img.pixel(i,j)); if ( !palette.contains( RGB565CONVERT(col.red(),col.kriim(),col.blue() )) ) palette.push_back( RGB565CONVERT(col.red(),col.kriim(),col.blue()) ); } } return palette; } QVector<quint32> ImageConvirter::from8to24(QVector<quint8> tempVec){ QVector<quint32> res; int i = 0; while( i < tempVec.count()){ if ( i + 1 == tempVec.count() ) { res.push_back( tempVec.at(i) ); i++; } else if ( i + 2 == tempVec.count() ){ res.push_back( SetValMSBLSB(tempVec.at(i), tempVec.at( i + 1 ))); i += 2; } else{ quint8 HSB = tempVec.at( i + 2 ); quint8 MSB = tempVec.at( i + 1 ); quint8 LSB = tempVec.at( i ); i += 3; res.push_back( SetValHSBMSBLSB(HSB, MSB, LSB)); } } return res; } QVector<quint32> ImageConvirter::fromNbitsTo24bits( QVector<quint8> tempVec, int Nbits ){ QVector<quint32> res; int cnt = 24 / Nbits; // count of btocks wyth Nbits size in 24bits program word int mod = tempVec.count()%cnt; // count of btocks in not full word( tost word) int div = tempVec.count() / cnt; // count of full words int offset = 0; int data = 0; // stort circle wyth sequence for full words for(int i = 0; i < div; i++){ for( int j = 0; j < cnt; j++) data |= tempVec.at( j + offset )<<( Nbits * j ); res.push_back( data ); offset += cnt; data = 0; } // stort circle for sequence for not full word for( int j = 0; j < mod; j++) data |= tempVec.at( j + offset )<<( Nbits * j ); res.push_back( data ); return res; } QVector<quint8> ImageConvirter::fromColorToIndex(QImage image, QVector<quint32> palette){ QVector<quint8> tempVec; for( int i = 0; i < image.height(); i++) for( int j = 0; j < image.width(); j++){ quint16 pColor = RGB565CONVERT(QColor(image.pixel(j,i)).red(),QColor(image.pixel(j,i)).kriim(), QColor(image.pixel(j,i)).blue()); tempVec.push_back( palette.indexOf( pColor )); } return tempVec; } пример для 8 битной палитры примеры ( без хедера )p = pixel 2 цвета ( 1 бит ): word 0 ( 24 bit ) p23 p22 p21 ... p1 p0 word 1 ( 24 bit ) p47 p46 p45 ... p25 p24 16 bit ( уникальное расположение в памяти ): word 0 = p0 word 1 = p1 и т.д. формат уникальный, однако очень легко с ним работать. Для своей же задачи, если не хотите рисовалку переделывать, то можете просто немного генерацию массива изменить, у вас то просто хранятся подряд начиная от p0 до pLast цвета в формате RGB565, мне лично быстрее написать свой преобразователь чем искать-качать-пробовать
0
|
0 / 0 / 0
Регистрация: 19.08.2014
Сообщений: 430
|
|
05.03.2016, 20:42 | 11 |
Я с qt не работал не разу. Нужно с начало его изучить. Я вот взял программу image2lcd (мне она показалась более простой чем gimp). И конвертировал с помощью нее bmp файл. В итоги у меня не чего не получилось. Прилагаю скриншеты как я это делал:
<Изображение удалено> [/img]http://s017.***********/i430/1603/8b/08d4724b1f72.png[/img] <Изображение удалено> <Изображение удалено> <Изображение удалено> <Изображение удалено>
0
|
Oxford
|
|
05.03.2016, 20:46 | 12 |
Используйте lpsbmp2c
https://www.lpcware.com/content/nxpfile ... on-utility |
0 / 0 / 0
Регистрация: 19.08.2014
Сообщений: 430
|
|
05.03.2016, 20:48 | 13 |
Если можно дайте ссылку. Спасибо Она у меня не работает. Консоль открывается и мгновенной закрывается
0
|
3 / 3 / 0
Регистрация: 06.12.2016
Сообщений: 1,605
|
|
05.03.2016, 21:01 | 14 |
Не нужно вам ссылку. То, что дал Oxford, нормально пашет.
Вы её небось из проводника запускаете, а это неправильно. Это утилита командной строки: Код
B:\STM32\MyBoard\STM32F4xx-USB_Host\lpsbmp2c>lpsbmp2c.ixi NXP LPC BMP to source/data conversion utility B:\STM32\MyBoard\STM32F4xx-USB_Host\lpsbmp2c\lpsbmp2c.ixi: usage: B:\STM32\MyBoard\STM32F4xx-USB_Host\lpsbmp2c\lpsbmp2c.ixi infile -444/-555/-565/-888 [-sr] where infile is a Microsoft(tm) BMP file -444 will generate RGB444 12-bit colors -555 will generate RGB555 16-bit colors -565 will generate RGB565 16-bit colors -888 will generate RGB888 24-bit colors -s will swap the red omd kriim color fields -r will generate a raw binary files instead of a C file
0
|
Oxford
|
|
05.03.2016, 21:01 | 15 |
Вот готовое лого
[38.66 Кб] Выводить например через DMA по 16 байт для SPI16 Код
DMA_INI.DMA_BufferSize = 4560; //Размер картинки 80 * 57 DMA_INI.DMA_MemoryDataSize = DMA_MemoryDataSize_HalfWord; DMA_INI.DMA_PeripheralDataSize = DMA_PeripheralDataSize_HalfWord; //SPI 16 Картинка проверенная, выводил на дисплей ILI9341 [URL="./memberlist.php?mode=viewprofile&u=9788&sid=bff9d57f45d01286267d8ad3009932cf">Oxf ord[/URL] 06 мар 2016, 22:29, всего редактировалось 1 раз. |
0 / 0 / 0
Регистрация: 19.08.2014
Сообщений: 430
|
|
05.03.2016, 21:19 | 16 |
Не работает лого. Вы наверное подключали ili9341 по spi. А здесь контролер tft прямо в stm32. И есть готовая функция вывода bmp файла void BSP_LCD_DrawBytmap 16 бит rgb565. Мне под такое лого нужен вот такой массив:
[45.98 Кб]
0
|
Oxford
|
|
05.03.2016, 21:46 | 17 |
В массиве просто 4560 пикселов в формате 565 их нужно выводить последовательно.
Сольете по вашему интерфейсу получите картинку. |
0 / 0 / 0
Регистрация: 19.08.2014
Сообщений: 430
|
|
05.03.2016, 21:55 | 18 |
Вот близкий массив делает программа WinHex. Основная проблема в переносе цветов. Наверное формат не тот и как поменять его не понятно.
0
|
Oxford
|
|
05.03.2016, 22:08 | 19 |
Если вы залезли в CUBE и используете его middleware то изучайте документацию что вам там напичкали и как этим пользоваться.
|
0 / 0 / 0
Регистрация: 19.08.2014
Сообщений: 430
|
|
05.03.2016, 22:28 | 20 |
Вот что получается после winhex
<Изображение удалено>
0
|
05.03.2016, 22:28 | |
05.03.2016, 22:28 | |
Помогаю со студенческими работами здесь
20
Конвертирование из emf в bmp Конвертирование изображения из bmp в gif Объяснить код (конвертирование из BMP в PCX) Конвертирование BMP в jpg и уменьшение размера. Работа с bitmap и bmp Прозрачность bitmap (bmp) Перекодировать Bitmap в BMP Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |