powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Отображение матрицы цветов на Canvas
25 сообщений из 28, страница 1 из 2
Отображение матрицы цветов на Canvas
    #39549243
kaktus1983
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Добрый вечер!
Суть вопроса: есть двумерный массив double значений, размерностью примерно [500,1000].
Каждый элемент массива интерпретируется в цветовое значение, т.е. получается массив [500,1000] типа TColor.
Далее необходимо вывести его на Canvas.
Первое что приходить в голову: в цикле Canvas.Pixels[i,j] := ...
Очень медленно. Что-то не могу сообразить, как это быстро и правильно сделать.
...
Рейтинг: 0 / 0
Отображение матрицы цветов на Canvas
    #39549244
rgreat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Работай через Bmp.ScanLine
...
Рейтинг: 0 / 0
Отображение матрицы цветов на Canvas
    #39549248
fd00ch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SetDIBitsToDevice можно заюзать
...
Рейтинг: 0 / 0
Отображение матрицы цветов на Canvas
    #39549250
Соколинский Борис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
rgreat,
+1

kaktus1983,
только имей в виду, что в битмапе не RGB, а BGR.
...
Рейтинг: 0 / 0
Отображение матрицы цветов на Canvas
    #39549256
rgreat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В битмапе вообще то есть PixelFormat. И он разный бывает.

И лучше его самому явно выставить, дабы не было сюрпризов.
...
Рейтинг: 0 / 0
Отображение матрицы цветов на Canvas
    #39549547
kaktus1983
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Спасибо!
Bmp.ScanLine ускорило в несколько раз процесс вывода
SetDIBitsToDevice и BitBlt поюзаю по свободе для сравнения
...
Рейтинг: 0 / 0
Отображение матрицы цветов на Canvas
    #39549556
Фотография Квейд
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kaktus1983Спасибо!
Bmp.ScanLine ускорило в несколько раз процесс вывода
Можно еще ускорить в несколько раз, просто используя обычную арифметику указателей (Bmp.ScanLine из-за оверхеда очень медленно работает в цикле).
...
Рейтинг: 0 / 0
Отображение матрицы цветов на Canvas
    #39549557
kaktus1983
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Квейд,
пока достаточно, если будет необходимость, то учту этот момент
...
Рейтинг: 0 / 0
Отображение матрицы цветов на Canvas
    #39549659
Соколинский Борис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
КвейдМожно еще ускорить в несколько раз, просто используя обычную арифметику указателей (Bmp.ScanLine из-за оверхеда очень медленно работает в цикле). Арифметика там не совсем обычная, и
особого ускорения не замечал.
...
Рейтинг: 0 / 0
Отображение матрицы цветов на Canvas
    #39549661
rgreat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вполне достаточно вызвать Bmp.ScanLine[0]. 1 раз.
...
Рейтинг: 0 / 0
Отображение матрицы цветов на Canvas
    #39549682
Соколинский Борис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
тогда уже BMP.Scanline[height-1]
...
Рейтинг: 0 / 0
Отображение матрицы цветов на Canvas
    #39549685
rgreat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Соколинский Бористогда уже BMP.Scanline[height-1]
Зачем?
...
Рейтинг: 0 / 0
Отображение матрицы цветов на Canvas
    #39549688
rgreat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Уточню. Зачем тебе указатель на образно "середину" памяти битмапки?
...
Рейтинг: 0 / 0
Отображение матрицы цветов на Canvas
    #39549689
Соколинский Борис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
rgreat,
В "битмапке" строки хранятся в памяти снизу вверх.
...
Рейтинг: 0 / 0
Отображение матрицы цветов на Canvas
    #39549697
rgreat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Соколинский Борисrgreat,
В "битмапке" строки хранятся в памяти снизу вверх.
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
var
  Bmp: TBitmap;

procedure TForm15.Button1Click(Sender: TObject);
var
  P : Pointer;
  I : Integer;
begin
  if Bmp=nil then begin
    Bmp:=TBitmap.Create;
    Bmp.PixelFormat:=pf24bit;
    Bmp.SetSize(Image1.Width,Image1.Height);
    Bmp.Canvas.Brush.Color:=clWhite;
    Bmp.Canvas.FillRect(Bmp.Canvas.ClipRect);
  end;

  for I:=0 to 255 do begin
    P:=Bmp.ScanLine[i];
    FillMemory(P,3*Bmp.Width,i);
  end;

  Image1.Picture.Bitmap.Assign(Bmp);
  Image1.Repaint;
end;
...
Рейтинг: 0 / 0
Отображение матрицы цветов на Canvas
    #39549703
Соколинский Борис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
rgreat,
и что это должно доказывать?
...
Рейтинг: 0 / 0
Отображение матрицы цветов на Canvas
    #39549792
rgreat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Соколинский Борис,

Вот что я имел в виду:
Код: pascal
1.
2.
3.
4.
  P:=Bmp.ScanLine[0];
  for i:=0 to 255 do begin
    FillMemory(Pointer(NativeInt(P)-i*Bmp.Width*3),3*Bmp.Width,i);
  end;
...
Рейтинг: 0 / 0
Отображение матрицы цветов на Canvas
    #39549795
Соколинский Борис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
rgreat,
так можно, но смысла большого не вижу. Трудно себе представить ситуацию, когда время вычисления адреса строки будет больше чем работа со строкой.
Кстати, в этом коде ошибка, будет правильно работать только со строкой, кратной 4 пикселям.
...
Рейтинг: 0 / 0
Отображение матрицы цветов на Canvas
    #39549810
rgreat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Соколинский Борисв этом коде ошибка, будет правильно работать только со строкой, кратной 4 пикселям.
Почему?
...
Рейтинг: 0 / 0
Отображение матрицы цветов на Canvas
    #39549811
Соколинский Борис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
rgreat, проверь.
Потому что в "битмапке" длина строки в байтах должна быть кратна 4. Если не кратна, дополняется байтами.
...
Рейтинг: 0 / 0
Отображение матрицы цветов на Canvas
    #39549813
Фотография Квейд
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Соколинский БорисКвейдМожно еще ускорить в несколько раз, просто используя обычную арифметику указателей (Bmp.ScanLine из-за оверхеда очень медленно работает в цикле). Арифметика там не совсем обычная, и
особого ускорения не замечал.Я накладывал эффект darkness на битмап в цикле, вроде такого

Код: pascal
1.
2.
3.
4.
5.
    for Y := 0 to ABitmap.Height - 1 do
    begin
      P0 := ABitmap.ScanLine[Y]; // вычисляем на каждой итерации
      //......
    end



в конечном итоге пришел к тому, что так выполняется быстрее в несколько раз

Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
  procedure BitmapDarkness(Bitmap: TBitmap; Value: Integer);
  var
    BitmapDelta: Integer;
    BitmapPixels: Integer;
    X, Y: Integer;
    Dest: PRGBTriple;
  begin
    with Bitmap do // вычисляем один раз
    begin
      BitmapPixels := Integer(ScanLine[0]);
      BitmapDelta := Integer(ScanLine[1]);
      Dec(BitmapDelta, BitmapPixels)
    end;
    for Y := 0 to Pred(Bitmap.Height) do
    begin
      Dest := PRGBTriple(BitmapPixels + BitmapDelta * Y);
      for X := 0 to Pred(Bitmap.Width) do
      begin
        with Dest^ do
        begin
          rgbtBlue := Limit(rgbtBlue + Value);
          rgbtGreen := Limit(rgbtGreen + Value);
          rgbtRed := Limit(rgbtRed + Value);
        end;
        Inc(Dest)
      end
    end
  end;



По-приколу поискал бутылочное горлышко, оказалось что тормоза вот здесь

Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
function TBitmap.GetScanLine(Row: Integer): Pointer;
begin
  Changing(Self);
  with FImage.FDIB, dsbm, dsbmih do
  begin
    if (Row < 0) or (Row >= bmHeight) then
      InvalidOperation(@SScanLine);
    DIBNeeded;
    GDIFlush;
    if biHeight > 0 then  // bottom-up DIB
      Row := biHeight - Row - 1;
    Result := PByte(bmBits) +
      Row * BytesPerScanline(biWidth, biBitCount, 32);
  end;
end;
...
Рейтинг: 0 / 0
Отображение матрицы цветов на Canvas
    #39549814
Фотография Квейд
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Соколинский БорисВ "битмапке" строки хранятся в памяти снизу вверх.в 100% случаев? уверен?
...
Рейтинг: 0 / 0
Отображение матрицы цветов на Canvas
    #39549815
Соколинский Борис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Квейд, забавно.
Код этот, конечно, видел, но на выделенную строку не обращал внимания.
Какому идиоту, интересно, это понадобилось?
...
Рейтинг: 0 / 0
Отображение матрицы цветов на Canvas
    #39549816
Соколинский Борис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
КвейдСоколинский БорисВ "битмапке" строки хранятся в памяти снизу вверх.в 100% случаев? уверен? В 99%
С отрицательной высотой DirectShow-устройства выдают иногда.
...
Рейтинг: 0 / 0
Отображение матрицы цветов на Canvas
    #39549819
rgreat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Соколинский Борис,

Хм. Да. pf32bit решает проблему.
...
Рейтинг: 0 / 0
25 сообщений из 28, страница 1 из 2
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Отображение матрицы цветов на Canvas
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]