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

Вниз

RGB, взять значение пикселя и утановить...   Найти похожие ветки 

 
Lefan   (2004-07-30 08:40) [0]

Приветсвую всех!
Вот хотелось бы попробовать такую штуку sybj...
т.е. загрузить каритнку, взять у нее значение RGB первого пикселя, затем второго и т.д.
а так же в обратную сторону, установить значение RGB первого пикселя ...

куда копать или может уже есть где примерчики?

Заранее благодарен за ответ.
С уважением Алексей.


 
MegaVolt   (2004-07-30 09:31) [1]

http://www.delphimaster.ru/articles/pixels/index.html


 
_Zergey   (2004-07-30 09:38) [2]

procedure GlassyBitmapRect(Bmp:TBitmap;R:TRect;
Transparency:byte;TransparentColor:TColor;
GlassyDirection:TGlassyDirection = gdNone);
var
w,h,x,y:integer;
sl:PRGBArray;
b:byte;
tc:COLORREF;
begin
Dec(R.Right);
Dec(R.Bottom);
w:=WidthOf(R);
h:=HeightOf(R);
tc:=ColorToRGB(TransparentColor);
for y:=R.Top to R.Bottom do
begin
 sl:=Bmp.ScanLine[y];
 for x:=R.Left to R.Right do
 with sl[x] do
 try
  case GlassyDirection of
   gdtLR:b:=Round((100-Transparency)/w*x+Transparency);
   gdtRL:b:=Round((100-Transparency)/w*(w-x)+Transparency);
   gdtTB:b:=Round((100-Transparency)/h*y+Transparency);
   gdtBT:b:=Round((100-Transparency)/h*(h-y)+Transparency);
   gddLR:b:=Round(Transparency/w*x);
   gddRL:b:=Round(Transparency/w*(w-x));
   gddTB:b:=Round(Transparency/h*y);
   gddBT:b:=Round(Transparency/h*(h-y))
   else b:=Transparency
  end;
  rgbtRed:=((100-b)*GetRValue(tc)+(b*rgbtRed)) div 100;
  rgbtGreen:=((100-b)*GetGValue(tc)+(b*rgbtGreen)) div 100;
  rgbtBlue:=((100-b)*GetBValue(tc)+(b*rgbtBlue)) div 100
 except
 end
end
end;

Надеюсь сия процедура просветлит сознание - она создает эффект наблюдения битмапа ч-з цветное стекло...


 
Анонимщик ©   (2004-07-30 12:00) [3]

Нужно только учитывать, сколько там бит на пиксель. В этом коде предполагается, что 24, видимо.


 
_Zergey   (2004-07-30 12:23) [4]

Ладно, если возникли замечания, то скажу, что в самом деле преабразовывать битмап попиксельно удобнее всего при
Bmp.PixelFormat:=pf24bit;
для етого проще всего написать процедурку с преобразованием типа:

procedure DoScanBmp(Bitmap:TBitmap);
var
 Temp:TBitmap;
begin
 if Bitmap.Empty then Exit;
 Temp:=TBitmap.Create;
 try
   Temp.PixelFormat:=pf24bit;
   Temp.Width:=Bitmap.Width;
   Temp.Height:=Bitmap.Height;
   Temp.Canvas.Draw(0,0,Bitmap);
   // process to scan pixels ...
   Bitmap.Canvas.Draw(0,0,Temp);
 finally
   Temp.Free
 end
end;

кроме этого могу уточнить, что

type
 TGlassyDirection = (gdNone,gdtLR,gdtRL,gdtTB,gdtBT,gddLR,gddRL,gddTB,gddBT);
 TRGBArray = packed array [0..0] of TRGBTriple;
 PRGBArray = ^TRGBArray;

надеюсь что теперь понятно все :)


 
Анонимщик ©   (2004-07-30 12:58) [5]

Ну это удобнее, но не всегда допустимо. Впрочем, пусть будет домашним заданием. Здесь в статьях есть что-то вроде быстрого доступа к пикселям, там все написано.


 
Lefan   (2004-07-30 13:26) [6]

Спасибо большое...  :)



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

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

Наверх




Память: 0.48 MB
Время: 0.049 c
3-1095710137
Донской
2004-09-20 23:55
2004.10.24
Прога закрывается сразу после запуска - ADO ???


14-1096633204
QuasiLamo
2004-10-01 16:20
2004.10.24
Формат CSV


1-1097412833
CoolMan
2004-10-10 16:53
2004.10.24
Чтение строки из файла и помещение её в TEdit


1-1097235049
Cosinus
2004-10-08 15:30
2004.10.24
StringGrid и пунктир if gdFocused (DrawFocusRect)?


1-1097582555
}|{yk
2004-10-12 16:02
2004.10.24
Как правильно отправить сообщение создаваемому в run-time окну?