![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
ScanLine?
{RASkov} © (2007-06-02 15:31:00)Как можно быстрым способом получить средний цвет битмапа размером 100х100 пикселей
Нужена помощь с самим алгоритмом определения, со СканЛайн раньше никогда не работал, но думаю, что как раз с ним и нужно здесь...
Пояснение: Битмап имеет оттенки серого - нужно как бы сложить все цвета пикселей и разделить на их(пикселей) кол-во.. или как по другому?
Размер Битмапа тоже может меняться, указал средний...
Математика - это не мое, поэтому прошу помощи )
Loginov Dmitry (2007-06-02 18:11:00) [21]> Так в чем же различие обоих функций?
Видимо, в наличии packed recordпри объявлении TRGBTriple в [2]
{RASkov} (2007-06-02 18:02:00) [22]> [11] DVM © (02.06.07 17:12)
Точно... в первом проходе цикла они увеличатся на значения первого(нулевого) пиксела...
Спасибо...
Так в чем же различие обоих функций?
[2] по скорости работает быстрее, но результат не понятный, а [3] по скорости немного уступает, но результат, то что надо....??
На данный момент я сделал так (изменил [3])/ скорость немного повысилась, почти как у [2] стала.
С учетом, что битмап имеет только градацию серого...
function GetAverageColor(Bitmap: TBitmap): TColor;
var X, Y, Sum, Count: LongInt; B: Byte;
begin
Bitmap.PixelFormat := pf24Bit;
Sum:=0; Count:=0;
for Y := 0 to Bitmap.Height - 1 do begin
Dest := Bitmap.ScanLine[y];
for X := 0 to Bitmap.Width - 1 do begin
with Dest^ do begin
inc(Sum, R);
end;
Inc(Dest);
INC(Count);
end;
end;
// B := Round(Sum/Count);
B := Sum div Count;
Result:=RGB(B, B, B);
end;
Dest вынес за пределы функции...
DVM (2007-06-02 17:12:00) [23]
> {RASkov} © (02.06.07 16:58) [10]
SummR:=0;
SummG:=0;
SummB:=0;
{RASkov} (2007-06-02 16:58:00) [24]С заменой разобрался )
with Dest^ do begin
inc(SummR, R);
inc(SummG, G);
inc(SummB, B);
end;
оба варианта [2] и [3] вроде бы делают одно и тоже но результаты разные...
И я тут резко так ответил, что не вопрос про инциализацию переменных, но после задумался, правильно ли я понял....
Вот как я переделал [3] вариант... вроде результат, то что надо )
function Sredniy(Bitmap: TBitmap): TColor;
type TRGB = record
B, G, R: Byte;
end;
pRGB = ^TRGB;
var Dest: pRGB;
X, Y: Word;
SummR, SummG, SummB: LongInt;
SR, SG, SB: Byte;
begin
Bitmap.PixelFormat := pf24Bit;
SummR:=GetRValue(Bitmap.Canvas.Pixels[0,0]);
SummG:=GetGValue(Bitmap.Canvas.Pixels[0,0]);
SummB:=GetBValue(Bitmap.Canvas.Pixels[0,0]);
for Y := 0 to Bitmap.Height - 1 do begin
Dest := Bitmap.ScanLine[y];
for X := 0 to Bitmap.Width - 1 do begin
with Dest^ do begin
inc(SummR, R);
inc(SummG, G);
inc(SummB, B);
end;
Inc(Dest);
end;
end;
SR := Round(SummR/(Bitmap.Width*Bitmap.Height));
SG := Round(SummG/(Bitmap.Width*Bitmap.Height));
SB := Round(SummB/(Bitmap.Width*Bitmap.Height));
Result:=RGB(SR, SG, SB);
end;
Ну это на скорую руку, поэтому может и не так оптимально/красиво....
Верно ли я с инициализацией определился? Спасибо.
{RASkov} (2007-06-02 16:26:00) [25]> Стартовые значения лучше задать. Но автор вопроса сам поймет, я думаю.
С этим не вопрос :)
С вариантом [2] разобрался.... хотел для сравнения, и лучшего понимания всего этого, заставить работать и вариант [3] но не смог...(
Не смог понять что есть GT[B], GT[G] и GT[R], т.е. не то чтобы понять, смысл - то понял, а вот заменить не пойму чем... даже с учетом [4] :(
Сейчас думаю разберусь...)
Спасибо еще раз всем.
DVM (2007-06-02 16:17:00) [26]
> antonn © (02.06.07 16:14) [7]
Стартовые значения лучше задать. Но автор вопроса сам поймет, я думаю.
antonn (2007-06-02 16:14:00) [27]кстати, заметил, что ни SumR, ни SummR не получают стартового значения (сказал так сказал, не помню как правильно это называется, а ляпать не хочу, боквоедов много:)), код корректно отработает? просто интересно, привык всегда после введения переменной задавать ей исходное значение.
DVM (2007-06-02 16:08:00) [28]
> очепятка, наверное? :)
да, конечно.
{RASkov} (2007-06-02 16:07:00) [29]Спасибо... сейчас буду пробывать.
antonn (2007-06-02 16:04:00) [30]
> inc(SumR, Row[x].rgbtRed);
> inc(SumR, Row[x].rgbtGreen);
> inc(SumR, Row[x].rgbtBlue);
очепятка, наверное? :)
Вовчик (2007-06-02 15:56:00) [31]procedure Sredniy(Bitmap: TBitmap; var SR, SG, SB: Integer);
type TRGB = record
B, G, R: Byte;
end;
pRGB = ^TRGB;
var Dest: pRGB;
X, Y: Word;
SummR, SummG, SummB: LongInt;
begin
Bitmap.PixelFormat := pf24Bit;
for Y := 0 to Bitmap.Height - 1 do begin
Dest := Bitmap.ScanLine[y];
for X := 0 to Bitmap.Width - 1 do begin
with Dest^ do begin
Inc(SummB, GT[B]);
Inc(SummG, GT[G]);
Inc(SummR, GT[R]);
end;
Inc(Dest);
end;
end;
SR := Round(SummR/(Bitmap.Width*Bitmap.Height));
SG := Round(SummG/(Bitmap.Width*Bitmap.Height));
SB := Round(SummB/(Bitmap.Width*Bitmap.Height));
end;
DVM (2007-06-02 15:55:00) [32]Как то так:
function GetBitmapColor(Bmp: TBitmap): TColor;
const
Pixels = MaxInt div SizeOf(TRGBTriple);
type
PRGBArray = ^TRGBArray;
TRGBArray = array[0..Pixels-1] of TRGBTriple;
var
x, y: Integer;
Row: PRGBArray;
SumR: integer;
SumG: integer;
SumB: integer;
Count: integer;
begin
Bmp.PixelFormat := pf24bit;
for y := 0 to Bmp.Height - 1 do
begin
Row := Bmp.ScanLine[y];
for x := 0 to Bmp.Width - 1 do
begin
inc(SumR, Row[x].rgbtRed);
inc(SumR, Row[x].rgbtGreen);
inc(SumR, Row[x].rgbtBlue);
inc(Count);
end;
end;
result := RGB(SumR div Count, SumG div Count, SumB div Count);
end;
sergey_61 (2007-06-02 15:51:00) [33]У меня есть мысли, но незнаю как реализовать.
В градациях серего, все 3 цвета имеют одинаковое значение(например: F1F1F1), может сделать проверку через яркость пикселя? или что то подобное.
Или выделить только один цвет...