Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Как ускорить процесс зарисовки SetPixel 
:(
    Опции темы
ashtone
Дата 18.9.2015, 19:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Суть проблемы вот в чем. Имею двухмерную матрицу чисел 512х512, числа в матрице в пределах от 800 и до 2500. Далее приравняв максимальное число к белому цвету а минимальное к черному, остальные рассчитываю относительно первых, надо вывести эту матрицу на экран, путем зарисовки пикселей (512х512) соответствующим цветом (от белого к черному). В итоге получится некая серая рябь. Но проблема в том, что зарисовка происходит уж очень медленно, видно как кадр построчно рисуется. Как ускорить данный процесс?? или хотя бы как сделать так, что бы не было видно самого процесса зарисовки, а записать массив цветов каждого пикселя и сразу все вывести разом.

Вот сама функция вывода на экран изображения (переменные min и max глобальные и рассчитываются в другой функции, рисую на Picture Control, к которой привязана переменная m_paint:

Код

void CMy01Dlg::Kadr()
{
        int amount = (max - min)/32;
        int color;
 
        CDC *pDC = m_paint.GetDC();
        RECT rc;
        m_paint.GetClientRect(&rc);
 
        for ( int i=0; i < 512; i++){
        for( int j=0; j < 512razmer_file_y-1; j++){
           color =255- (((max - mass[j][i])/amount)*8); 
              pDC->SetPixel(i,j,RGB(color,color,color));
 
          }
        }
   m_paint.ReleaseDC(pDC);
}


Я так понял надо копать в сторону SetDIBits и BitBlt, но пока не могу понять как реализовать используя эти функции (Использую Visual Studio 2010 MFC)

PM MAIL   Вверх
ashtone
Дата 18.9.2015, 23:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Все решил проблему.

решил подобным образом:


Код

void CMy01Dlg::Kadr()
{
   CDC *pDC = m_paint.GetDC();
    RECT rc;
    m_paint.GetClientRect(&rc);
    int CX = 512, CY = 512;
    DWORD *lpbInit = new DWORD[CX * CY];

      for (int i = 0; i < CY; i++){
            for (int j = 0; j < CX; j++){
               BYTE color = (BYTE)(255 - ((max - mass[i][j])/raznost)*8);
               lpbInit[i*CX+j] = RGB(color, color, color);
                 }
           }

      BITMAPINFO bmi = {
      sizeof(BITMAPINFOHEADER), CX, CY, 1, 32, BI_RGB, 0,
      0, 0, 0, 0 
      };

      HBITMAP hBitmap = ::CreateDIBitmap(
      pDC->GetSafeHdc(), &bmi.bmiHeader, CBM_INIT,lpbInit, &bmi,          DIB_RGB_COLORS);
     CBitmap bitmap;
     bitmap.Attach(hBitmap);

     pDC->DrawState(CPoint(10, 10), CSize(CX, CY), &bitmap, DST_BITMAP);
     
     bitmap.DeleteObject();
     delete lpbInit;
}



Все рисуется достаточно быстро и незаметно.

Но возникла некая проблемка. Как задать размер пикселя, при прорисовки изображения?? так как рисунок не влазит в отведенную область, да и придется еще работать с более крупными изображениями... вот что бы их масштабировать надо указать размер рисуемого пикселя.. только вот где..[code=cpp]

PM MAIL   Вверх
Pavlovich
Дата 19.9.2015, 11:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Цитата

   ...так как рисунок не влазит в отведенную область, да и придется еще работать с более крупными изображениями...
   

Функция StretchBlt поможет.

Этот ответ добавлен с нового Винграда - http://vingrad.com
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Visual C++/MFC/WTL | Следующая тема »


 




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


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

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