Ru-Board.club
← Вернуться в раздел «Прикладное программирование»

» Графика в Delphi

Автор: merlkerry
Дата сообщения: 08.01.2003 09:52
xn0bys
это все не очень красиво - объясни зачем rgB делить нацело на 3 ???

З.Ы. Кроме того, быстрее не a div b делать, если b=2^c а юзать shr -> a shr c; ну и соответственно не умножать а юзать shl. И вообще проще все это представить как массив 3х байтов ...
Автор: xn0bys
Дата сообщения: 08.01.2003 10:26
merlkerry

Цитата:
объясни зачем rgB делить нацело на 3

Среднее арифметическое (у тебя 3 канала r,g,b :-o )


Цитата:
shr

Можно и так.

А вообще я дал для примера, шоб наглядней (я же писал, что сам не проверял, вот проверь, посмотри что получится, затим напиши, мне тоже антиресно)
Автор: Pinocchio
Дата сообщения: 08.01.2003 13:41
На счёт - не врубается, так я вообще "чайник".
Привожу DOS функции (извините проценты распределения RGB не запомнил, но имеются в книжке).



INT 10 - VIDEO - PERFORM GRAY-SCALE SUMMING (VGA/MCGA)
AX = 101Bh
BX = starting palette register
CX = number of registers to convert
Desc: convert the RGB values of one or more palette registers such that the resulting values are grays with the same intensities as the original colors



INT 10 - VIDEO - ALTERNATE FUNCTION SELECT (VGA, MCGA) - GRAY-SCALE SUMMING
AH = 12h
BL = 33h
AL = new state
00h enable gray scale summing
01h disable gray scale summing
Return: AL = 12h if function supported
Desc: specify whether or not colors should be converted to gray scale when palette or color registers are loaded
Автор: moonrise
Дата сообщения: 08.01.2003 13:56
merlkerry
xn0bys
Можно поподробнее и итог.. что правильнее?? Прошу не счесть за наглость, просто с графикой не возился.
На данный момент делаю при помощи
Код: Pictire.Bitmap.PixelFormat := pf8bit;
Автор: xn0bys
Дата сообщения: 08.01.2003 15:12
Pinocchio
Я тоже ничего не понял, зачем екраном дрыгать?
И емну же нуно в Delphi.

moonrise
Поподробнее не могу, пока, сегодня вечером дома попробую, мне все равно с этим работать нуна.
Завтре скажу...
Автор: moonrise
Дата сообщения: 08.01.2003 15:32
xn0bys
ок. пасиб.
буду ждать
Автор: xn0bys
Дата сообщения: 09.01.2003 07:32
moonrise
в 256 grayscale:
как я писал выше

Цитата:
i:=(((i and $ff0000) div 65536)+((i and $00ff00) div 256)+(i and $0000ff)) div 3;

Работает!!!, т.е. i=0...255;

А задавать цвет по палитре можешь так:
Image1.Canvas.Pixels[i,j] := X*65536+X*256+X;
ну или shl используй.
(через scanline гораздо быстрее, смотри help).

Должно работать!

Автор: moonrise
Дата сообщения: 09.01.2003 09:43
xn0bys

Цитата:
через scanline гораздо быстрее
как я понял ScanLine позволяет только считать, а не записать...
т.е. считывать быстрее так как сейчас я и делаю?

Добавлено
merlkerry
а как с массивом это сделать?
Автор: merlkerry
Дата сообщения: 09.01.2003 11:26
moonrise

Цитата:
а как с массивом это сделать?


ну типа того что

Код:
...

var intPixel,:Integer;
ptrPixel:^Array[0..3] of Byte;

Pixel:=@intPixel;

...

intPixel:=Image1.Canvas.Pixels[i,j];

intPixel:=(ptrPixel^[0]+ptrPixel^[1]+ptrPixel^[2]) div 3;

ну и дальше ...

...

Автор: moonrise
Дата сообщения: 09.01.2003 11:47
merlkerry

Цитата:
а как с массивом это сделать?


Цитата:
intPixel:=(ptrPixel^[0]+ptrPixel^[1]+ptrPixel^[2]) div 3;

Да нет.. меня интересовало как загнать в ptrPixel[i] из TColor
Автор: xn0bys
Дата сообщения: 09.01.2003 12:41
moonrise

Цитата:
как я понял ScanLine позволяет только считать, а не записать...

ты не прав:

Код:
type
TRGB=record
b,g,r:byte;
end;
ARGB=array [0..1] of TRGB;
PARGB=^ARGB;

...
var p : PARGB;
begin

p:=bitmap.scanline[y];
i:=p[x].r;
p[x].r:=i;
end;
Автор: Pinocchio
Дата сообщения: 09.01.2003 14:26
Только поправлю (естественно проценты я не помню, но знаю что так делают грамотные люди, а раскладку по процентам можно увидеть в анналах по приведённым мною функциям)

type
TRGB=record
windows,b,g,r:byte;
end;

var c: tcolor;

begin
Intens := 27%(TRGB(ParamColor).b) +
31%(TRGB(ParamColor).g) + 33%(TRGB(ParamColor).r);
TRGB(c).b := Intens;
TRGB(c).g := Intens;
TRGB(c).r := Intens;
...


Добавлено
Для преодразования к серому надо вспомнить, что каналы R,G и B воспринимаются человеческим глазом по разному (имеют разную интенсивность).
Ребята, чаще заглядывайте в доки и не думайте, что переплюнуть создателей текстового режима будет весело.
Автор: moonrise
Дата сообщения: 09.01.2003 21:38
xn0bys

Цитата:
Understand?
вполне. асм, к сожалению не знаю напроч

Pinocchio
твой уровень, наверное для меня на данном этапе непостижим.. что касается кода - почти все понятно, но не понятно что ты поправил что касается преодразования к серому - то, что
Цитата:
R,G и B воспринимаются человеческим глазом по разному (имеют разную интенсивность).
мне ничего не дает... делать то как? И я не собираюсь кого-то переплевывать. я хочу сделать просто рабочую прогу для целей кафедры... (ну и своих тоже). причем кафедры физики.. т.е. там людям далеко до программирования. Поэтому прошу не очень обижаться моей непонятливости в данном вопросе.
Автор: Pinocchio
Дата сообщения: 10.01.2003 10:59
moonrise
Я поправил беседу. xn0bys очень хорошо объясняет, только даже через ассемблер вряд ли быстрее. Delphi отлично оптимизирует, что можно увидеть в окне CPU.

const с_R = 34; с_G = 33; с_B = 33;

Pixel := ((TRGB(P1).R*c_R)+(TRGB(P1).G*c_G)+
(TRGB(P1).B*c_B)) div 100;
TRGB(P2).R := Pixel; .... и так далее.

Я опять забыл посмотреть реальные проценты. Обратного преобразования из серого в цветное никто не делал.
Автор: moonrise
Дата сообщения: 10.01.2003 11:08
Pinocchio
а обратное и не нужно
Автор: moonrise
Дата сообщения: 10.01.2003 17:45
Pinocchio

Цитата:
Я опять забыл посмотреть реальные проценты

Яркость = 0.59*G + 0.3*R + 0.11*B
Автор: The3DAlex
Дата сообщения: 12.01.2003 21:29
Ребята, всем привет!
Не знаю сюда или нет, в общем такой вопрос-
есть авишка, как сделать exe файл, содержащий проигрователь и ету авишку, чтоб по окончании он сам закрывался, и всё это с учётом , что я в делфях почти полный ноль.
(Я просто хочу свой ролик в стартап загнать, сделать вроде заставки при входе в винду, кстати какой файл стартапа будет запускаться первый, тот который первый в реестре прописан?)
Автор: Pinocchio
Дата сообщения: 13.01.2003 09:38
moonrise
Абсолютно верные цифири (до мулюметра).

The3DAlex
Нужно купить, или взять почитать книгу про Delphi.
Можно создать новый опрос о том:
"1. как сохранить AVI в RES файле,
2. как присоединить RES файл в Delphi,
3. как пользоваться TStream.CopyFrom,
4. как пользоваться медиа данными."
Автор: merlkerry
Дата сообщения: 13.01.2003 10:14
The3DAlex
Прежде всего прочти правила и не пости один и тот же вопрос в надцать темок ...

Автор: moonrise
Дата сообщения: 16.01.2003 10:34
Всем принимавшим участие - БОЛЬШОЕ СПАСИБО. c тем, что меня интересовало - разобрался. осталось прогу доделать, но это не долго.. главное, что все вопросы решены. Еще раз Спасибо.

Страницы: 12

Предыдущая тема: Excel


Форум Ru-Board.club — поднят 15-09-2016 числа. Цель - сохранить наследие старого Ru-Board, истории становления российского интернета. Сделано для людей.