IMHO.WS

IMHO.WS (https://www.imho.ws/index.php)
-   Программирование (https://www.imho.ws/forumdisplay.php?f=40)
-   -   Быстрое отображение битового образа (https://www.imho.ws/showthread.php?t=74202)

lokiSE 23.11.2004 20:42

Быстрое отображение битового образа
 
Есть поток. Из него я декодирую картинки. картинки получаются в таком виде: RGB RGB RGB, т.е. на каждый цвет по 1 байту - 3 байта на пиксел, на картинку - 320*240*3 байта. Все байты лежат в массиве 320*240*3 заподряд. Есть еще на форме компонент picture.
А вопрос такой: как эффективнее всего перенести битовый образ (мой массив, в котором лежат триплеты байтов) на компонент picture, т.е. попросту мой образ нужно отобразить на форму, если можно без компонента picture - еще лучше, т.е. отображать прямо на свободном месте формы мою картинку. Наилучший способ для меня - просто получить указатель на область памяти и скопировать мой массив туда и чтоб после такого копирования картинка появилась на экране в нужном мне месте формы

Borland 23.11.2004 21:56

lokiSE
Под виндой?
Если да, то надо копать в сторону DirectDraw. Этот API позволяет с максимальной скоростью отображать любые картинки в любую область экрана.

kot_ 23.11.2004 21:58

Цитата:

Сообщение от lokiSE
Есть поток. Из него я декодирую картинки. картинки получаются в таком виде: RGB RGB RGB, т.е. на каждый цвет по 1 байту - 3 байта на пиксел, на картинку - 320*240*3 байта. Все байты лежат в массиве 320*240*3 заподряд. Есть еще на форме компонент picture.
А вопрос такой: как эффективнее всего перенести битовый образ (мой массив, в котором лежат триплеты байтов) на компонент picture, т.е. попросту мой образ нужно отобразить на форму, если можно без компонента picture - еще лучше, т.е. отображать прямо на свободном месте формы мою картинку. Наилучший способ для меня - просто получить указатель на область памяти и скопировать мой массив туда и чтоб после такого копирования картинка появилась на экране в нужном мне месте формы

Здесь важно то что по сути своей форма - это поверхность на которой ты можешь рисовать. При этом если по задаче нужна поддержка DirectX - значит используешь его и работаешь с поверхностями. Если не нужна - значит рисуешь в памяти а потом используешь функцию копирования. Ну например BitBlt(HDC hdcDest,int xDest,int YDest,int Width,int Height,HDC hdcSours,int XSrs,int YSrs,DWORD Rop) - она как раз и используется для подобных операций.

/7y3uK 24.11.2004 15:20

ИМХО, если исходить из VCL Delphi, то на простом канвасе формы рисовать напрямую можно только через Pixels, однако у TImage уже реализован класс Bitmap с методами загрузки/записи из потока/в поток, и есть ScanLine,в который достаточно быстро можно выгрузить из потока триплеты, только нужно установить формат пикселя и цветовой режим, для триплетов 24 бита и без цветовой палитры... только следует учитывать выравнивания по байту и нужно знать ширину и высоту картинки в пикселях.

kot_ 24.11.2004 15:47

Цитата:

Сообщение от /7y3uK
ИМХО, если исходить из VCL Delphi, то на простом канвасе формы рисовать напрямую можно только через Pixels, однако у TImage уже реализован класс Bitmap с методами загрузки/записи из потока/в поток, и есть ScanLine,в который достаточно быстро можно выгрузить из потока триплеты, только нужно установить формат пикселя и цветовой режим, для триплетов 24 бита и без цветовой палитры... только следует учитывать выравнивания по байту и нужно знать ширину и высоту картинки в пикселях.

Тебя интересует способ быстрого копирования на форму, или тебе необходимо решение для класса TCanvas? Ты опредились. Если тебе необходимо просто загрузить картинку - используй Form1->DoubleBuffered=true;
В дельфях это будет выглядеть наверно Form1.DoubleBuffered = True
После этого ты спокойно можешь реализовать копирование на TCanvas.


Часовой пояс GMT +4, время: 02:21.

Powered by vBulletin® Version 3.8.5
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.