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

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

И лучше его самому явно выставить, дабы не было сюрпризов.
...
Рейтинг: 0 / 0
08.11.2017, 14:02:51
    #39549547
kaktus1983
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Отображение матрицы цветов на Canvas
Спасибо!
Bmp.ScanLine ускорило в несколько раз процесс вывода
SetDIBitsToDevice и BitBlt поюзаю по свободе для сравнения
...
Рейтинг: 0 / 0
08.11.2017, 14:10:04
    #39549556
Квейд
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Отображение матрицы цветов на Canvas
kaktus1983Спасибо!
Bmp.ScanLine ускорило в несколько раз процесс вывода
Можно еще ускорить в несколько раз, просто используя обычную арифметику указателей (Bmp.ScanLine из-за оверхеда очень медленно работает в цикле).
...
Рейтинг: 0 / 0
08.11.2017, 14:12:57
    #39549557
kaktus1983
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Отображение матрицы цветов на Canvas
Квейд,
пока достаточно, если будет необходимость, то учту этот момент
...
Рейтинг: 0 / 0
08.11.2017, 15:38:53
    #39549659
Соколинский Борис
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Отображение матрицы цветов на Canvas
КвейдМожно еще ускорить в несколько раз, просто используя обычную арифметику указателей (Bmp.ScanLine из-за оверхеда очень медленно работает в цикле). Арифметика там не совсем обычная, и
особого ускорения не замечал.
...
Рейтинг: 0 / 0
08.11.2017, 15:40:10
    #39549661
rgreat
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Отображение матрицы цветов на Canvas
Вполне достаточно вызвать Bmp.ScanLine[0]. 1 раз.
...
Рейтинг: 0 / 0
08.11.2017, 15:56:16
    #39549682
Соколинский Борис
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Отображение матрицы цветов на Canvas
тогда уже BMP.Scanline[height-1]
...
Рейтинг: 0 / 0
08.11.2017, 15:58:56
    #39549685
rgreat
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Отображение матрицы цветов на Canvas
Соколинский Бористогда уже BMP.Scanline[height-1]
Зачем?
...
Рейтинг: 0 / 0
08.11.2017, 16:00:02
    #39549688
rgreat
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Отображение матрицы цветов на Canvas
Уточню. Зачем тебе указатель на образно "середину" памяти битмапки?
...
Рейтинг: 0 / 0
08.11.2017, 16:00:47
    #39549689
Соколинский Борис
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Отображение матрицы цветов на Canvas
rgreat,
В "битмапке" строки хранятся в памяти снизу вверх.
...
Рейтинг: 0 / 0
08.11.2017, 16:10:07
    #39549697
rgreat
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Отображение матрицы цветов на Canvas
Соколинский Борис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
08.11.2017, 16:15:46
    #39549703
Соколинский Борис
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Отображение матрицы цветов на Canvas
rgreat,
и что это должно доказывать?
...
Рейтинг: 0 / 0
08.11.2017, 17:50:54
    #39549792
rgreat
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Отображение матрицы цветов на Canvas
Соколинский Борис,

Вот что я имел в виду:
Код: 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
08.11.2017, 17:56:31
    #39549795
Соколинский Борис
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Отображение матрицы цветов на Canvas
rgreat,
так можно, но смысла большого не вижу. Трудно себе представить ситуацию, когда время вычисления адреса строки будет больше чем работа со строкой.
Кстати, в этом коде ошибка, будет правильно работать только со строкой, кратной 4 пикселям.
...
Рейтинг: 0 / 0
08.11.2017, 18:12:04
    #39549810
rgreat
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Отображение матрицы цветов на Canvas
Соколинский Борисв этом коде ошибка, будет правильно работать только со строкой, кратной 4 пикселям.
Почему?
...
Рейтинг: 0 / 0
08.11.2017, 18:16:28
    #39549811
Соколинский Борис
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Отображение матрицы цветов на Canvas
rgreat, проверь.
Потому что в "битмапке" длина строки в байтах должна быть кратна 4. Если не кратна, дополняется байтами.
...
Рейтинг: 0 / 0
08.11.2017, 18:17:38
    #39549813
Квейд
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Отображение матрицы цветов на Canvas
Соколинский БорисКвейдМожно еще ускорить в несколько раз, просто используя обычную арифметику указателей (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
08.11.2017, 18:18:19
    #39549814
Квейд
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Отображение матрицы цветов на Canvas
Соколинский БорисВ "битмапке" строки хранятся в памяти снизу вверх.в 100% случаев? уверен?
...
Рейтинг: 0 / 0
08.11.2017, 18:21:08
    #39549815
Соколинский Борис
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Отображение матрицы цветов на Canvas
Квейд, забавно.
Код этот, конечно, видел, но на выделенную строку не обращал внимания.
Какому идиоту, интересно, это понадобилось?
...
Рейтинг: 0 / 0
08.11.2017, 18:22:14
    #39549816
Соколинский Борис
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Отображение матрицы цветов на Canvas
КвейдСоколинский БорисВ "битмапке" строки хранятся в памяти снизу вверх.в 100% случаев? уверен? В 99%
С отрицательной высотой DirectShow-устройства выдают иногда.
...
Рейтинг: 0 / 0
08.11.2017, 18:23:58
    #39549819
rgreat
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Отображение матрицы цветов на Canvas
Соколинский Борис,

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


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