Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

ScanLine?


Страницы:   1 2

{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), может сделать проверку через яркость пикселя? или что то подобное.
Или выделить только один цвет...


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо