Главная страница
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.032 c
6-1092940190
Луарвик
2004-08-19 22:29
2004.10.24
Веб програмирование: отправка запросов в инет?


8-1091007521
xdev
2004-07-28 13:38
2004.10.24
Полупрозрачная форма


1-1097131451
Dr. Genius
2004-10-07 10:44
2004.10.24
Смена кодировки строки из ANSI в ASCII


1-1097214974
Ozone
2004-10-08 09:56
2004.10.24
Рисовать в консоли


14-1096982834
jack128
2004-10-05 17:27
2004.10.24
Не кто не стаккивался с таким явлением...