![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
RGB, взять значение пикселя и утановить... [D5, D6, D7, NT4, Win2k, WinXP]
Lefan © (2004-07-30 08:40:00)Приветсвую всех!
Вот хотелось бы попробовать такую штуку sybj...
т.е. загрузить каритнку, взять у нее значение RGB первого пикселя, затем второго и т.д.
а так же в обратную сторону, установить значение RGB первого пикселя ...
куда копать или может уже есть где примерчики?
Заранее благодарен за ответ.
С уважением Алексей.
Lefan (2004-07-30 13:26:00) [1]Спасибо большое... :)
Анонимщик (2004-07-30 12:58:00) [2]Ну это удобнее, но не всегда допустимо. Впрочем, пусть будет домашним заданием. Здесь в статьях есть что-то вроде быстрого доступа к пикселям, там все написано.
_Zergey (2004-07-30 12:23:00) [3]Ладно, если возникли замечания, то скажу, что в самом деле преабразовывать битмап попиксельно удобнее всего при
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:00:00) [4]Нужно только учитывать, сколько там бит на пиксель. В этом коде предполагается, что 24, видимо.
_Zergey (2004-07-30 09:38:00) [5]
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;
Надеюсь сия процедура просветлит сознание - она создает эффект наблюдения битмапа ч-з цветное стекло...
MegaVolt (2004-07-30 09:31:00) [6]http://www.delphimaster.ru/articles/pixels/index.html