Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 18.04.2022, 14:37   #1
Kronos913
Форумчанин
 
Регистрация: 10.02.2021
Сообщений: 603
По умолчанию TColor to TRGBTriple

Есть ли прямой способ преобразовать TColor в TRGBTriple?
Или нужно конструировать сложную конструкцию?
Kronos913 вне форума Ответить с цитированием
Старый 18.04.2022, 15:49   #2
macomics
Участник клуба
 
Регистрация: 17.04.2022
Сообщений: 1,833
По умолчанию

Попробуйте так:
Код:
with color as TRGBTriple do
  red := 100;
end;
macomics вне форума Ответить с цитированием
Старый 18.04.2022, 18:56   #3
Kronos913
Форумчанин
 
Регистрация: 10.02.2021
Сообщений: 603
По умолчанию

У меня задача такая: обращаюсь к BitMap через ScanLine

И нужно определенные пиксели покрасить в цвет, который хранится в переменной TColor

Я пока вот такой вот код составил:

Код:
var
  a: TColor;
  bb: TRGBTriple;
  r, g, b: byte;
Код:
  asm
    mov edx, a
    mov r, dl
    shr edx, 8
    mov g, dl
    shr edx, 8
    mov b, dl
  end;

  bb.rgbtRed:=r;
  bb.rgbtBlue:=b;
  bb.rgbtGreen:=g;
Может есть более оптимальный вариант?
Kronos913 вне форума Ответить с цитированием
Старый 18.04.2022, 19:39   #4
macomics
Участник клуба
 
Регистрация: 17.04.2022
Сообщений: 1,833
По умолчанию

Код:
var
  color: record
    case Byte of
      0: (a: TColor);
      1: (bb: TRGBTriple);
  end;
Код:
color.a := bmap.Pixel[x,y];
color.bb.rgbtRed := 255;
macomics вне форума Ответить с цитированием
Старый 18.04.2022, 21:13   #5
Kronos913
Форумчанин
 
Регистрация: 10.02.2021
Сообщений: 603
По умолчанию

В чём проблема? Код внутри основной процедуры
Код:
var
  
  a: TColor;
  bb: TRGBTriple;
Код:
  asm
    mov ecx, a
    mov edx, 0
    mov dl, cl
    shr ecx, 8
    shl edx, 8
    mov dl, cl
    shr ecx, 8
    shl edx, 8
    mov dl, cl
    lea eax, bb
    mov [eax], edx
  end;
Работает, проверил, всё ок

Теперь! Выношу в отдельную процедуру:
Код:
Procedure TColorToTRGBTriple(const InColor:TColor; var bb:TRGBTriple);
asm
    mov ecx, InColor
    mov edx, 0
    mov dl, cl
    shr ecx, 8
    shl edx, 8
    mov dl, cl
    shr ecx, 8
    shl edx, 8
    mov dl, cl
    lea eax, bb
    mov [eax], edx
end;
Подсвечивает ошибку в "lea eax, bb"
В чем проблема?
Изображения
Тип файла: png изображение_2022-04-18_211332545.png (2.2 Кб, 25 просмотров)
Kronos913 вне форума Ответить с цитированием
Старый 18.04.2022, 21:18   #6
macomics
Участник клуба
 
Регистрация: 17.04.2022
Сообщений: 1,833
По умолчанию

Код:
bswap ecx //Если компилятор ее не знает значит dw $C90F
shr ecx, 8
lea eax, [bb]//или без скобок но lea eax, offset bb, но для локальной переменной по идее должно хватить скобок

Последний раз редактировалось macomics; 18.04.2022 в 21:26.
macomics вне форума Ответить с цитированием
Старый 18.04.2022, 21:36   #7
macomics
Участник клуба
 
Регистрация: 17.04.2022
Сообщений: 1,833
По умолчанию

Правда если вопрос только в положении цветовых компонентов, то может проще объявить что-то вроде:
Код:
type TBGRTriple = record
  bgrtBlue: Byte;
  bgrtGreen: Byte;
  bgrtRed: Byte;
end;

Procedure MyProc();
var
  c: record
    case Byte of
     0: (a: TColor);
     1: (bb: TBGRTriple);
  end;
  r: Byte;
begin
  c.a := $123456;
  r := c.bb.bgrtRed;
end;

Последний раз редактировалось macomics; 18.04.2022 в 21:46.
macomics вне форума Ответить с цитированием
Старый 18.04.2022, 23:50   #8
Kronos913
Форумчанин
 
Регистрация: 10.02.2021
Сообщений: 603
По умолчанию

У меня вообще никак не хотят в asm работать попытки обращение к параметрам с отметкой var
Kronos913 вне форума Ответить с цитированием
Старый 18.04.2022, 23:54   #9
macomics
Участник клуба
 
Регистрация: 17.04.2022
Сообщений: 1,833
По умолчанию

Вот и я не заметил, что это var. Но тогда в параметрах уже находится адрес структуры и его можно просто записать командой mov eax, bb
Только зачем вообще заниматься этой бесполезной перестановкой байтов. Для изображения 32*32 это уже потребует 1024 перестановок.
macomics вне форума Ответить с цитированием
Старый 19.04.2022, 02:28   #10
Kronos913
Форумчанин
 
Регистрация: 10.02.2021
Сообщений: 603
По умолчанию

Цитата:
Сообщение от macomics Посмотреть сообщение
Вот и я не заметил, что это var. Но тогда в параметрах уже находится адрес структуры и его можно просто записать командой mov eax, bb
Только зачем вообще заниматься этой бесполезной перестановкой байтов. Для изображения 32*32 это уже потребует 1024 перестановок.
Тут дело проще. Нужно переставить в одной переменной, на самом деле...

Просто потом эту переменная будет копироваться во все пустые пиксели
Kronos913 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
TColor -> Integer Katus Паскаль, Turbo Pascal, PascalABC.NET 6 05.03.2012 09:25
Из TColor в Tstring и обратно Godj Общие вопросы Delphi 3 20.04.2010 21:19
TRGBArray и TRGBTriple Илья PHoeNiX Помощь студентам 1 09.06.2008 15:04
Хранение TColor в Access $teelR@t БД в Delphi 2 20.09.2007 13:56
Работа с TImage-как установить длину массива TRGBTriple? Саня Компоненты Delphi 1 04.08.2007 11:15