Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: Не работает заполнение Image  (Прочитано 10426 раз)
0 Пользователей и 3 Гостей смотрят эту тему.
Shakesbeer
Постоялец

ru
Offline Offline

« : 20-04-2013 13:59 » 

Считываю данные с большой скоростью, получаю цвет пиксела, поэтому решил  работать с помощью canvas.
Написал доп функцию:
Код: (C++)
 for (int y=0; y<Form1->Image1->Picture->Height; y++)
    {
     RGBTRIPLE* Col = (RGBTRIPLE *) Form1->Image1->Picture->Bitmap->ScanLine[y];
     for (int x=0; x<Form1->Image1->Picture->Width; x++)
        {
         Col[x].rgbtGreen=Pxls[x][y];
         Col[x].rgbtRed=Pxls[x][y];
         Col[x].rgbtBlue=Pxls[x][y];
        }
    }
 Form1->Image1->Refresh();

Вставляю эту функцию в обработчик получения данных:

Код: (C++)
 for (unsigned int i = 0; i < strlen(inBuf); i++)
  {
   xpic++;
   if (xpic >= Form1->Image1->Picture->Width)
    {
     xpic = 0;
     ypic++;
    }
   if (ypic >= Form1->Image1->Picture->Height)
    {
     ypic = 0;
     WriteImage();
    }
   int a = inBuf[i];
   Pxls[xpic][ypic]=a; //çàáèâàåì ïîëó÷åííûé öâåò â ìàññèâ äàííûõ
  /*
   Form1->Image1->Canvas->Pixels[xpic][ypic]=TColor(RGB(a,a,a)); //ñðàçó ðèñóåì(ïðîïóñêàåò ïèêñåëè)
  */

  }
 ZeroMemory(inBuf, 512);
Ничего не рисует.
В чем может быть дело?
Записан
Dimka
Деятель
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #1 : 20-04-2013 15:39 » 

Shakesbeer, раз ты с большой скоростью читаешь пикселы из Bitmap, то самое правильное и писать с большой скоростью в Bitmap, а потом выводить Bitmap целиком на Canvas.
Записан

Программировать - значит понимать (К. Нюгард)
Невывернутое лучше, чем вправленное (М. Аврелий)
Многие готовы скорее умереть, чем подумать (Б. Рассел)
Shakesbeer
Постоялец

ru
Offline Offline

« Ответ #2 : 20-04-2013 15:47 » 

Shakesbeer, раз ты с большой скоростью читаешь пикселы из Bitmap, то самое правильное и писать с большой скоростью в Bitmap, а потом выводить Bitmap целиком на Canvas.
Хорошая идея.)
Только как это воплощается? Можно пример?)
Таким образом получается ещё дольше:
Код: (C++)
 for (int y=0; y<Form1->Image1->Picture->Height; y++)
   for (int x=0; x<Form1->Image1->Picture->Width; x++)
    Form1->Image1->Canvas->Pixels[x][y]=TColor(RGB(Pxls[x][y],Pxls[x][y],Pxls[x][y]));
« Последнее редактирование: 20-04-2013 15:59 от Shakesbeer » Записан
zubr
Гость
« Ответ #3 : 20-04-2013 16:29 » 

1. Судя по коду - почему тут что то должно рисовать? Или ты думаешь если массиву Col присваивать значения пикселов, то на канвасе будет рисоваться? В col ты просто сканируешь значения пикселов текущего контекста.
2. Алгоритм оптимального копирования:
2.1 Создаем битмап куда копируем рисунок, которым должно меняться изображение на текущем контексте.
2.2 Копируем созданный битмап в текущий канвас, используя BitBlt или StretchBlt, или используя TCanvas::CopyRect
Записан
Shakesbeer
Постоялец

ru
Offline Offline

« Ответ #4 : 20-04-2013 18:33 » 

zubr, спасибо, буду разбираться)

Добавлено через 2 дня, 14 часов, 59 минут и 28 секунд:
zubr, как с помощью BitBlt или StretchBlt идет попиксельное заполнение?
« Последнее редактирование: 23-04-2013 09:32 от Shakesbeer » Записан
Shakesbeer
Постоялец

ru
Offline Offline

« Ответ #5 : 23-04-2013 13:29 » new

Сделал с помощью:
Код: (C++)
Graphics::TBitmap * bmap;
 bmap = new Graphics::TBitmap;
 bmap->Width = Form1->Image1->Width;
 bmap->Height = Form1->Image1->Height;
.....
bmap->Canvas->Pixels[xpic][ypic]=TColor(RGB(tempCol,tempCol,tempCol));
......
Form1->Image1->Canvas->Draw(0,0,bmap);
Записан
zubr
Гость
« Ответ #6 : 23-04-2013 13:48 » 

Цитата
zubr, как с помощью BitBlt или StretchBlt идет попиксельное заполнение?
Данные функции копируют из одного контекста в другой. Как это происходит на уровне системы не знаю. Думаю, видеодрайвер копирует данные из одного буфера в другой.
Записан
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines