Форум: "Media";
Текущий архив: 2010.10.24;
Скачать: [xml.tar.bz2];
ВнизОбращение цевта и маштабирование Найти похожие ветки
← →
MIKron (2008-04-05 09:05) [0]Такая проблема. Приведу две процедуры и функции:
function bcolor(c:TColor):byte;
var x:longword;
r,g,b:byte;
begin
x:=longword(c);
r:=x and $ff;
g:=(x shr 8) and $ff;
b:=(x shr 16) and $ff;
result:=(r+g+b) div 3;
end;
function fimage(x,y:real):byte;
var w,h,i,j:integer;
a,b,z:real;
cx1,cx2,color1,color2:byte;
begin
w:=BMP.Width;
h:=BMP.Height;
z:=x*(w-1);
i:=trunc(z);
a:=frac(z);
z:=y*(h-1);
j:=trunc(z);
b:=frac(z);
with BMP.canvas do
begin
cx1:=bcolor(Pixels[i,j]);
cx2:=bcolor(Pixels[i+1,j]);
color1:=round(cx1*(1-a) + cx2*a);
cx1:=bcolor(Pixels[i,j+1]);
cx2:=bcolor(Pixels[i+1,j+1]);
color2:=round(cx1*(1-a) + cx2*a);
end;
result:=round(color1*(1-b) + color2*b);
end;
procedure TForm1.putimage(cv:TCanvas);
var i,j:integer;
w,h:integer;
hx,hy,x,y:real;
color:byte;
begin
w:=cv.ClipRect.Right;
h:=cv.ClipRect.Bottom;
hx:=1/w;
hy:=1/h;
for i:=1 to w-1 do
for j:=1 to h-1 do
begin
x:=i*hx;
y:=j*hy;
{ color:=fimage(x,y);}
cv.Pixels[i,j]:=paintbox1.canvas.pixels[round(x),round(y)];
end;
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
putimage(paintbox2.canvas);
end;
procedure TForm1.BitBtn1Click(Sender: TObject);
var MyRect, MyOther: TRect;
begin
if OpenPictureDialog1.Execute then
begin
BMP:=TBitMap.Create;
BMP.LoadFromFile(OpenPictureDialog1.FileName);
MyRect := Rect(16,20,27,32);
with paintbox1.Canvas do
CopyRect(MyRect,BMP.Canvas,MyRect);
with BMP.Canvas do
CopyRect(ClipRect,paintbox1.Canvas,MyRect);
end;
end;
Они обращают цвет и маштабирует рисунок хранящийся в BMP . И переводятся в paintbox1.canvas . Но проблема, что после по обращению по пиксельно (paintbox1.canvas.pixels[i,j]) вы водятся странные 8ми значные числа хотя изображение чернобелое. причем и черный и белый цвет обозначается одной цифрой. В чем дело?
← →
Sapersky (2008-04-06 13:21) [1]Pixels всегда возращает цвет в формате BBGGRR, например, белый цвет это $FFFFFF, в десятичном виде 16777215, вот вам и 8-значное число.
Но в приведённом коде это не должно создавать проблем (за исключением низкой скорости от излишних преобразований) - функция bcolor как раз и делает преобразование из BBGGRR в градации серого.
Страницы: 1 вся ветка
Форум: "Media";
Текущий архив: 2010.10.24;
Скачать: [xml.tar.bz2];
Память: 0.45 MB
Время: 0.003 c