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

Вниз

Обращение цевта и маштабирование   Найти похожие ветки 

 
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 вся ветка

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

Наверх




Память: 0.47 MB
Время: 0.011 c
2-1280316293
Danz1
2010-07-28 15:24
2010.10.24
СУБД в доп.потоке


15-1279551120
nobody
2010-07-19 18:52
2010.10.24
Беспричинное выключение или перезакгрузка компьютера


2-1280900619
adminwik
2010-08-04 09:43
2010.10.24
Помогите составить алгоритм!


3-1243308557
bdr
2009-05-26 07:29
2010.10.24
Как освободить каталог-базу Paradox?


2-1280382192
mm0
2010-07-29 09:43
2010.10.24
Выпадающий список как в google в строке поиска