RGB-массив ---> TImage->Picture
От: zmd  
Дата: 04.09.02 04:41
Оценка:
В наличии имеется массив (r, g, b), который надо вывести в Image. Использование Pixels[][], а также ScanLine неприемлимо, т.к. неудовлетворяет скорость работы. Думаю, надо использовать BitBlt, но как это сделать?

в цикле заполняется DWORD ResCl
ResCl[x + y*144] = 0 + ((r << 16) | (g << 8) | (b));BITMAPINFO* bmpInfo;

затем
BITMAPINFO* bmpInfo;
HDC cdc = CreateCompatibleDC(NULL);
ResBitmap = CreateCompatibleBitmap(cdc, 176, 144);
SetDIBits(cdc, ResBitmap, 0, 144, ResCl, bmpInfo, DIB_RGB_COLORS);
imExample->Picture->Bitmap->Handle = ResBitmap;

чего-то не так — ошибку выдает Access violation ... in module gdi32.dll
Re: RGB-массив ---> TImage->Picture
От: piAnd Россия  
Дата: 04.09.02 05:35
Оценка:
Здравствуйте zmd, Вы писали:

zmd>imExample->>Picture->Bitmap->Handle = ResBitmap;


zmd>чего-то не так — ошибку выдает Access violation ... in module gdi32.dll


Боюсь советовать, может быть так пойдет:
imExample->>Picture->Bitmap=(TBitmap *)ResBitmap;
Re[2]: RGB-массив ---> TImage->Picture
От: zmd  
Дата: 04.09.02 06:43
Оценка:
Здравствуйте piAnd, Вы писали:

A>Здравствуйте zmd, Вы писали:


zmd>>imExample->>Picture->Bitmap->Handle = ResBitmap;


zmd>>чего-то не так — ошибку выдает Access violation ... in module gdi32.dll


A>Боюсь советовать, может быть так пойдет:

A>
imExample->>>Picture->Bitmap=(TBitmap *)ResBitmap;
A>


нееет, такое не пройдет
надо по-другому ...
Re: RGB-массив ---> TImage->Picture
От: Flamer Кипр http://users.livejournal.com/_flamer_/
Дата: 04.09.02 06:52
Оценка:
Здравствуйте zmd, Вы писали:

zmd>В наличии имеется массив (r, g, b), который надо вывести в Image. Использование Pixels[][], а также ScanLine неприемлимо, т.к. неудовлетворяет скорость работы. Думаю, надо использовать BitBlt, но как это сделать?


zmd>в цикле заполняется DWORD ResCl

zmd>ResCl[x + y*144] = 0 + ((r << 16) | (g << 8) | (b));BITMAPINFO* bmpInfo;

zmd>затем

zmd>BITMAPINFO* bmpInfo;
zmd>HDC cdc = CreateCompatibleDC(NULL);
zmd>ResBitmap = CreateCompatibleBitmap(cdc, 176, 144);
zmd>SetDIBits(cdc, ResBitmap, 0, 144, ResCl, bmpInfo, DIB_RGB_COLORS);
imExample->>Picture->Bitmap->Handle = ResBitmap;

zmd>чего-то не так — ошибку выдает Access violation ... in module gdi32.dll


А если попробовать перед строкой

imExample->Picture->Bitmap->Handle = ResBitmap;


добавить

imExample->Picture->Bitmap->ReleaseHandle();


???

Хотя описанное странное поведение действительно странно... Есть еще предложение — попробуйте записать полученный битмап в файл *.bmp и посмотреть — а есть ли мальчик (то бишь рисунок). Есть сомнения, что AV возникает из-за того, что что-то не так именно в массиве полученных байт... То есть битмап битый получается. Все может быть...
Re: RGB-массив ---> TImage->Picture
От: piAnd Россия  
Дата: 04.09.02 14:51
Оценка:
Здравствуйте zmd, Вы писали:

zmd>В наличии имеется массив (r, g, b), который надо вывести в Image. Использование Pixels[][], а также ScanLine неприемлимо, т.к. неудовлетворяет скорость работы. Думаю, надо использовать BitBlt, но как это сделать?


zmd>в цикле заполняется DWORD ResCl

zmd>ResCl[x + y*144] = 0 + ((r << 16) | (g << 8) | (b));BITMAPINFO* bmpInfo;

zmd>затем

zmd>BITMAPINFO* bmpInfo;
zmd>HDC cdc = CreateCompatibleDC(NULL);
zmd>ResBitmap = CreateCompatibleBitmap(cdc, 176, 144);
zmd>SetDIBits(cdc, ResBitmap, 0, 144, ResCl, bmpInfo, DIB_RGB_COLORS);
imExample->>Picture->Bitmap->Handle = ResBitmap;

zmd>чего-то не так — ошибку выдает Access violation ... in module gdi32.dll


функция
int SetDIBits(hdc, hbmp, uStartScan, cScanLines, lpvBits, lpbmi, fuColorUse)

HDC hdc;    /* handle of device context    */
HBITMAP hbmp;    /* handle of bitmap    */
UINT uStartScan;    /* starting scan line    */
UINT cScanLines;    /* number of scan lines    */
const void FAR* lpvBits;    /* address of array with bitmap bits    */
BITMAPINFO FAR* lpbmi;    /* address of structure with bitmap data    */
UINT fuColorUse;    /* type of color indices to use    */

Там сказано, что UINT cScanLines есть число скан лайнов, а у Вас это "ширина" битмэпа , судя по ResCl
Может в этом дело?
Re[2]: RGB-массив ---> TImage->Picture
От: zmd  
Дата: 05.09.02 02:30
Оценка:
Здравствуйте piAnd, Вы писали:

A>Здравствуйте zmd, Вы писали:


zmd>>В наличии имеется массив (r, g, b), который надо вывести в Image. Использование Pixels[][], а также ScanLine неприемлимо, т.к. неудовлетворяет скорость работы. Думаю, надо использовать BitBlt, но как это сделать?


zmd>>в цикле заполняется DWORD ResCl

zmd>>ResCl[x + y*144] = 0 + ((r << 16) | (g << 8) | (b));BITMAPINFO* bmpInfo;

zmd>>затем

zmd>>BITMAPINFO* bmpInfo;
zmd>>HDC cdc = CreateCompatibleDC(NULL);
zmd>>ResBitmap = CreateCompatibleBitmap(cdc, 176, 144);
zmd>>SetDIBits(cdc, ResBitmap, 0, 144, ResCl, bmpInfo, DIB_RGB_COLORS);
imExample->>>Picture->Bitmap->Handle = ResBitmap;

zmd>>чего-то не так — ошибку выдает Access violation ... in module gdi32.dll


A>функция

A>
A>int SetDIBits(hdc, hbmp, uStartScan, cScanLines, lpvBits, lpbmi, fuColorUse)

A>HDC hdc;    /* handle of device context    */
A>HBITMAP hbmp;    /* handle of bitmap    */
A>UINT uStartScan;    /* starting scan line    */
A>UINT cScanLines;    /* number of scan lines    */
A>const void FAR* lpvBits;    /* address of array with bitmap bits    */
A>BITMAPINFO FAR* lpbmi;    /* address of structure with bitmap data    */
A>UINT fuColorUse;    /* type of color indices to use    */
A>

A>Там сказано, что UINT cScanLines есть число скан лайнов, а у Вас это "ширина" битмэпа , судя по ResCl
A>Может в этом дело?

144 — это высота битмапа. я понял, что в этом параметре именно она указывается
Re: RGB-массив ---> TImage->Picture
От: zmd  
Дата: 05.09.02 07:25
Оценка:
также попробовал
HBITMAP ResBitmap = CreateDIBSection(cdc, &bmpInfo, DIB_RGB_COLORS, (void **)&indResCl, NULL, 0);
и
SetDIBitsToDevice(cdc,
0,
0,
bmpInfo.bmiHeader.biWidth,
bmpInfo.bmiHeader.biHeight,
0,
0,
0,
bmpInfo.bmiHeader.biHeight,
(LPVOID)ResCl,
(LPBITMAPINFO)&bmpInfo,
DIB_RGB_COLORS);

ничего не помогат
правда access violation уже не вылетает, однако область просто закрашивается черным цветом и все,
никакого рисунка нет.
поможите ...
Re: RGB-массив ---> TImage->Picture
От: zmd  
Дата: 05.09.02 09:59
Оценка:
Проблема решена.
Всем спасибо. Если кому интересно, могу кинуть код.
Re[2]: RGB-массив ---> TImage->Picture
От: piAnd Россия  
Дата: 05.09.02 13:29
Оценка:
Здравствуйте zmd, Вы писали:

zmd>Проблема решена.

zmd>Всем спасибо. Если кому интересно, могу кинуть код.
кинь плз ,сюда или
Re[2]: RGB-массив ---> TImage->Picture
От: Pashka R. Украина  
Дата: 10.03.04 17:53
Оценка:
Здравствуйте, zmd, Вы писали:

zmd>Проблема решена.

zmd>Всем спасибо. Если кому интересно, могу кинуть код.

интересно, только, что столкнулся с этой проблемой — если не жалко — кинь на (чтоб я не сильно морочился.... посмотрю как ты это сделал...)

да, еще — скорость возросла?
-----
Best regards, Pashka R. <pashka@land.ru>
ICQ: 860730
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.