Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2006.03.26;
Скачать: CL | DM;

Вниз

Kak zgladit BitMap   Найти похожие ветки 

 
yura32 ©   (2005-10-19 23:07) [0]

vapros lamerskiy no vsyodki nujen otvet .
zaranie spasibo.


 
yura32 ©   (2005-10-20 03:51) [1]

4o ni kto ne znaet?


 
ЮЮ ©   (2005-10-20 04:06) [2]

TBitMap по определению прямоуголный, так что никак, даже напильник не поможет.

З.Ы. Заранее извини. Каков вопрос, таков ответ


 
PZ   (2005-10-20 11:14) [3]

У меня есть исходник. Если хотите, перешлю почтой.


 
yura32 ©   (2005-10-20 16:16) [4]

PZ
otprav pls


 
yura32 ©   (2005-10-20 16:17) [5]

outwar@mail.ru


 
PZ   (2005-10-20 16:35) [6]

Исходник отправил.
С уважением. PZ


 
yura32 ©   (2005-10-20 19:49) [7]

PZ

spasibo imeno to shto mne nado bilo :)


 
Expl   (2005-10-21 23:58) [8]

PZ. Помоги мне тоже с этим вопросом, если не затруднит. Заранее спасибо.


 
Fenik ©   (2005-10-22 01:04) [9]

procedure AntiAlias(Bitmap: TBitmap);
var x, y: Integer;
   p0, p1, p2: pByteArray;
begin
 Bitmap.PixelFormat := pf24Bit;
 for y := 1 to Bitmap.Height - 2 do begin
   p1 := Bitmap.ScanLine[y];
   p0 := Bitmap.ScanLine[y - 1];
   p2 := Bitmap.ScanLine[y + 1];
   for x := 0 to Bitmap.Width - 2 do begin
     p1[x*3]   := (p0[x*3]  +p2[x*3]  +p1[(x-1)*3]  +p1[(x+1)*3]) div 4;
     p1[x*3+1] := (p0[x*3+1]+p2[x*3+1]+p1[(x-1)*3+1]+p1[(x+1)*3+1]) div 4;
     p1[x*3+2] := (p0[x*3+2]+p2[x*3+2]+p1[(x-1)*3+2]+p1[(x+1)*3+2]) div 4;
   end;
 end;
end;


 
Ricks ©   (2005-10-22 02:11) [10]


> Fenik


Твой пример равносилен этому (если bitmap задан как массив [в моем случае черно-белый]):


// считать что GetBMVal возвращает цвет в заданной точке.
procedure BlurMap( var HM : TByteMatrix; w, l : integer );
var x, z : Cardinal;
   v    : single;
begin
for z:=0 to pred(l) do
 for x:=0 to pred(w) do begin
  v:=0;
  v:=v + GetBMVal( HM, w, l, x + 1, z - 1);
  v:=v + GetBMVal( HM, w, l,     x, z - 1);
  v:=v + GetBMVal( HM, w, l, x - 1, z - 1);

  v:=v + GetBMVal( HM, w, l, x - 1,     z);
  v:=v + GetBMVal( HM, w, l,     x,     z);
  v:=v + GetBMVal( HM, w, l, x + 1,     z);

  v:=v + GetBMVal( HM, w, l, x + 1, z + 1);
  v:=v + GetBMVal( HM, w, l,     x, z + 1);
  v:=v + GetBMVal( HM, w, l, x - 1, z + 1);
  if v <> 0 then v:=v / 9;
  HM[z, x]:=Round(v);
 end;
end;


Теперь такой вопрос:
Приведенные выше процедуры сглаживают изображение довольно сильно, а нельзя ли как-нибудь уменьшить степень сглаживания?


 
Expl   (2005-10-22 10:54) [11]

А можно как-то сгладить изображение, состоящее только из черных точек ( в моем случае рисованная стрелка), т.к. эти алгоритмы делают из нее одно большое черное пятно?


 
Fenik ©   (2005-10-22 14:50) [12]

> Ricks ©  (22.10.05 02:11) [10]
> а нельзя ли как-нибудь уменьшить степень сглаживания?


Побольше веса центральному пикселю, поменьше - окружающим.
Вот например:

procedure BlurBmp(Bmp: TBitmap; Value: Byte);
var x, y, x1, x2, x3, n, i: Integer;
   p1, p2, p3: pByteArray;
begin
 Bmp.PixelFormat := pf24Bit;
 n := Value + 8;
 for y := 0 to Bmp.Height - 1 do begin
   p1 := Bmp.ScanLine[Max(y - 1, 0)];
   p2 := Bmp.ScanLine[y];
   p3 := Bmp.ScanLine[Min(y + 1, Bmp.Height - 1)];
   for x := 0 to Bmp.Width - 1 do begin
     x1 := Max(x - 1, 0) * 3;
     x2 := x * 3;
     x3 := Min(x + 1, Bmp.Width - 1) * 3;
     for i := 0 to 2 do begin
       p2[x2+i] := Trunc((p1[x1+i] + p1[x2+i]       + p3[x3+i] +
                          p2[x1+i] + p2[x2+i]*Value + p2[x3+i] +
                          p3[x1+i] + p3[x2+i]       + p3[x3+i]) / (Value + 8));
     end;
   end;
 end;
end;


Чем больше Value, тем слабее смазывание. При 150 уже почти незаметно. При 0 - максимум.
Можно, кстати, угловые пиксели не учитывать. тогда будет так:

       p2[x2+i] := Trunc((           p1[x2+i] +
                          p2[x1+i] + p2[x2+i]*Value + p2[x3+i] +
                                     p3[x2+i]) / (Value + 4));


Короче говоря, вся суть в весовых коэффициентах при усреднении с соседними пикселами. Можно, допустим, угловым ставить меньше, чем боковым. Можно брать радиус больше. Это обычный матричный фильтр. В редакторах он значится как пользовательский или заказной - User Defined Filter.

> Expl  (22.10.05 10:54) [11]
> А можно как-то сгладить изображение, состоящее только из черных точек ( в моем случае рисованная стрелка), т.к. эти алгоритмы делают из нее одно большое черное пятно?


Я бы посоветовал рисовать стрелку в каком-нибудь граф.редакторе, который сам сглаживает линии.
Можно, конечно, поиграться с предложенной выше процедурой, но всё равно это будет хуже, чем можно сделать целенаправленным сглаживанием линий.


 
Fenik ©   (2005-10-22 15:21) [13]

Виноват, правильнее иметь один исходный растр и один изменяемый такого же размера, дабы не накапливать смазывание. Т.е. надо переделать так:

procedure BlurBmp(Src, Dest: TBitmap; Value: Byte);
var x, y, x1, x2, x3, i: Integer;
  p, p1, p2, p3: pByteArray;
begin
 for y := 0 to Src.Height - 1 do begin
   p := Dest.ScanLine[y];
   p1 := Src.ScanLine[Max(y - 1, 0)];
   p2 := Src.ScanLine[y];
   p3 := Src.ScanLine[Min(y + 1, Src.Height - 1)];
   for x := 0 to Src.Width - 1 do begin
     x1 := Max(x - 1, 0) * 3;
     x2 := x * 3;
     x3 := Min(x + 1, Src.Width - 1) * 3;
     for i := 0 to 2 do begin
        p[x2+i] := Trunc((p1[x1+i] + p1[x2+i]    + p3[x3+i] +
                p2[x1+i] + p2[x2+i]*Value + p2[x3+i] +
                p3[x1+i] + p3[x2+i]    + p3[x3+i]) / (Value + 8));
     end;
   end;
 end;
end;



Страницы: 1 вся ветка

Текущий архив: 2006.03.26;
Скачать: CL | DM;

Наверх




Память: 0.5 MB
Время: 0.047 c
2-1142348864
Khim
2006-03-14 18:07
2006.03.26
Ord( a )


2-1141846999
asd
2006-03-08 22:43
2006.03.26
Поддержка символов в Memo


15-1141408225
ZeFiR
2006-03-03 20:50
2006.03.26
бесплатный хостинг со своим доменом


15-1141378859
49 Cent
2006-03-03 12:40
2006.03.26
Можно ли реализовать подобную программу?


2-1141672750
mrAndersen
2006-03-06 22:19
2006.03.26
Текст