Модератор: Tolik
feya писал(а):zed
Иногда тайлы возвращаются с белым участком снизу. Думал сначала просто нет к-либо тайла, но после повторной загрузки отображает нормально.
procedure FillBitmap(var FillingLines: array of byte; var FillCount:byte; var bitmap:TBitmap);
var
i,j,z,k,n,_R,_G,_B : byte;
StepCount:smallint;
clr1,clr2:array [0..255] of TColor;
R,G,B,r1,g1,b1,r2,g2,b2:array [0..255] of smallint;
begin
n:=FillCount;
for j := 0 to FillCount-1 do
begin
z:=1;
for k:=FillingLines[j]+1 to FillingLines[j+1]-1 do
begin
if FillingLines[j]<=254 then
begin
StepCount:=abs(FillingLines[j+1]-FillingLines[j]);
for i := 0 to 255 do
begin
Clr1[i]:=bitmap.Canvas.Pixels[i,FillingLines[j]];
Clr2[i]:=bitmap.Canvas.Pixels[i,FillingLines[j+1]];
R1[i]:=GetRvalue(Clr1[i]);
G1[i]:=GetGvalue(Clr1[i]);
B1[i]:=GetBvalue(Clr1[i]);
R2[i]:=GetRvalue(Clr2[i]);
G2[i]:=GetGvalue(Clr2[i]);
B2[i]:=GetBvalue(Clr2[i]);
R[i]:=(R2[i]-R1[i]) div (StepCount);
G[i]:=(G2[i]-G1[i]) div (StepCount);
B[i]:=(B2[i]-B1[i]) div (StepCount);
end;
for i := 1 to 254 do
begin
_R:=((R1[i-1]+R[i-1]*z)+(R1[i]+R[i]*z)+(R1[i+1]+R[i+1]*z)) div 3;
_G:=((G1[i-1]+G[i-1]*z)+(G1[i]+G[i]*z)+(G1[i+1]+G[i+1]*z)) div 3;
_B:=((B1[i-1]+B[i-1]*z)+(B1[i]+B[i]*z)+(B1[i+1]+B[i+1]*z)) div 3;
bitmap.Canvas.Pixels[i,(FillingLines[j]+z)]:=RGB(_r,_g,_b); // записали сгенерированный пиксель
end;
_R:=((R1[0]+R[0]*z)+(R1[0+1]+R[0+1]*z)) div 2;
_G:=((G1[0]+G[0]*z)+(G1[0+1]+G[0+1]*z)) div 2;
_B:=((B1[0]+B[0]*z)+(B1[0+1]+B[0+1]*z)) div 2;
bitmap.Canvas.Pixels[0,(FillingLines[j]+z)]:=RGB(_r,_g,_b); // записали сгенерированный (нулевой) пиксель
_R:=((R1[255-1]+R[255-1]*z)+(R1[255]+R[255]*z)) div 2;
_G:=((G1[255-1]+G[255-1]*z)+(G1[255]+G[255]*z)) div 2;
_B:=((B1[255-1]+B[255-1]*z)+(B1[255]+B[255]*z)) div 2;
bitmap.Canvas.Pixels[255,(FillingLines[j]+z)]:=RGB(_r,_g,_b); // записали сгенерированный (последний) пиксель
inc(z);
inc(n);
end;
end;
end;
while n<>0 do
begin
Bitmap.Canvas.CopyRect( rect(0,n,256,n+1), Bitmap.Canvas, rect(0,n-1,256,n) );
inc(n);
end;
end;
procedure FillBitmap(var FillingLines: array of byte; var FillCount:byte; var bitmap:TBitmap);
var i,j,z,k,n:byte;
StepCount:smallint;
Pclr0,Pclr1,Pclr2:PRGBTriple;
BGR:TRGBTriple;
R,G,B,r1,g1,b1,r2,g2,b2:array [0..255] of smallint;
begin
n:=FillCount;
for j := 0 to FillCount-1 do
begin
z:=1;
if FillingLines[j]<=254 then
begin
Pclr0:=bitmap.ScanLine[FillingLines[j]+z];
for k:=FillingLines[j]+1 to FillingLines[j+1]-1 do
begin
StepCount:=abs(FillingLines[j+1]-FillingLines[j]);
Pclr1:=bitmap.ScanLine[FillingLines[j]];
Pclr2:=bitmap.ScanLine[FillingLines[j+1]];
for i := 0 to 255 do
begin
R1[i]:=Pclr1.rgbtRed;
G1[i]:=Pclr1.rgbtGreen;
B1[i]:=Pclr1.rgbtBlue;
R2[i]:=Pclr2.rgbtRed;
G2[i]:=Pclr2.rgbtGreen;
B2[i]:=Pclr2.rgbtBlue;
R[i]:=(R2[i]-R1[i]) div StepCount;
G[i]:=(G2[i]-G1[i]) div StepCount;
B[i]:=(B2[i]-B1[i]) div StepCount;
inc(Pclr1);
inc(Pclr2);
end;
Pclr1:=bitmap.ScanLine[FillingLines[j]+z];
inc(Pclr1);
for i := 1 to 254 do
begin
BGR.rgbtRed:=(R1[i-1]+R1[i]+R1[i+1]+(R[i]+R[i-1]+R[i+1])*z) div 3;
BGR.rgbtGreen:=(G1[i-1]+G1[i]+G1[i+1]+(G[i]+G[i-1]+G[i+1])*z) div 3;
BGR.rgbtBlue:=(B1[i-1]+B1[i]+B1[i+1]+(B[i]+B[i-1]+B[i+1])*z) div 3;
CopyMemory(Pclr1,@BGR,SizeOf(TRGBTriple));
inc(Pclr1);
end;
BGR.rgbtRed:=(R1[0]+R1[1]+(R[0]+R[1])*z) shr 1;
BGR.rgbtGreen:=(G1[0]+G1[1]+(G[0]+G[1])*z) shr 1;
BGR.rgbtBlue:=(B1[0]+B1[1]+(B[0]+B[1])*z) shr 1;
CopyMemory(Pclr0,@BGR,SizeOf(TRGBTriple));
inc(Pclr0,255);
BGR.rgbtRed:=(R1[254]+R1[255]+(R[254]+R[255])*z) shr 1;
BGR.rgbtGreen:=(G1[254]+G1[255]+(G[254]+G[255])*z) shr 1;
BGR.rgbtBlue:=(B1[254]+B1[255]+(B[254]+B[255])*z) shr 1;
CopyMemory(Pclr0,@BGR,SizeOf(TRGBTriple));
inc(Pclr0);
inc(z);
inc(n);
end;
end;
end;
while n<>0 do
begin
Bitmap.Canvas.CopyRect( rect(0,n,256,n+1), Bitmap.Canvas, rect(0,n-1,256,n) );
inc(n);
end;
end;
До было ~140мс, сейчас ~0-15мс.
А качество думаю сильно не улучшиш. У GE также немного расплывчато выглядят тайлы.
var i:integer;
FillingLines:array of byte;
Btm:TBitmap;
FillCount:byte;
begin
for i:=1 to 255 do if (i mod 4)=0 then
begin
SetLength(FillingLines,length(FillingLines)+1);
FillingLines[length(FillingLines)-1]:=i;
end;
Btm:=TBitmap.Create;
Btm.LoadFromFile('c:\y0.bmp');
FillCount:=length(FillingLines);
tic:=GetTickCount;
FillBitmap1(FillingLines, FillCount, Btm);
ShowMessage(inttostr(GetTickCount-tic));
Image2.Canvas.Draw(0,0,btm);
Btm.Free;
procedure FillBitmap1(var FillingLines: array of byte; var FillCount:byte; var bitmap:TBitmap);
var i,j,z,k,n:byte;
StepCount:smallint;
Pclr0,Pclr1,Pclr2:PRGBTriple;
BGR:TRGBTriple;
R,G,B,r1,g1,b1,r2,g2,b2:array [0..255] of smallint;
begin
n:=FillCount;
for j := 0 to FillCount-1 do
begin
z:=1;
for k:=FillingLines[j]+1 to FillingLines[j+1]-1 do
if FillingLines[j]<=254 then
begin
StepCount:=abs(FillingLines[j+1]-FillingLines[j]);
Pclr1:=bitmap.ScanLine[FillingLines[j]];
Pclr2:=bitmap.ScanLine[FillingLines[j+1]];
for i := 0 to 255 do
begin
R1[i]:=Pclr1.rgbtRed;
G1[i]:=Pclr1.rgbtGreen;
B1[i]:=Pclr1.rgbtBlue;
R2[i]:=Pclr2.rgbtRed;
G2[i]:=Pclr2.rgbtGreen;
B2[i]:=Pclr2.rgbtBlue;
R[i]:=(R2[i]-R1[i]) div StepCount;
G[i]:=(G2[i]-G1[i]) div StepCount;
B[i]:=(B2[i]-B1[i]) div StepCount;
inc(Pclr1);
inc(Pclr2);
end;
Pclr0:=Pointer(integer(bitmap.ScanLine[FillingLines[j]+z])+3);
for i := 1 to 254 do
begin
BGR.rgbtRed:=(R1[i-1]+R1[i]+R1[i+1]+(R[i]+R[i-1]+R[i+1])*z) div 3;
BGR.rgbtGreen:=(G1[i-1]+G1[i]+G1[i+1]+(G[i]+G[i-1]+G[i+1])*z) div 3;
BGR.rgbtBlue:=(B1[i-1]+B1[i]+B1[i+1]+(B[i]+B[i-1]+B[i+1])*z) div 3;
Pclr0^:=BGR;
inc(Pclr0);
end;
BGR.rgbtRed:=(R1[254]+R1[255]+(R[254]+R[255])*z) shr 1;
BGR.rgbtGreen:=(G1[254]+G1[255]+(G[254]+G[255])*z) shr 1;
BGR.rgbtBlue:=(B1[254]+B1[255]+(B[254]+B[255])*z) shr 1;
Pclr0^:=BGR;
BGR.rgbtRed:=(R1[0]+R1[1]+(R[0]+R[1])*z) shr 1;
BGR.rgbtGreen:=(G1[0]+G1[1]+(G[0]+G[1])*z) shr 1;
BGR.rgbtBlue:=(B1[0]+B1[1]+(B[0]+B[1])*z) shr 1;
dec(Pclr0,255);
Pclr0^:=BGR;
inc(z);
inc(n);
end;
end;
while n<>0 do
begin
Bitmap.Canvas.CopyRect( rect(0,n,256,n+1), Bitmap.Canvas, rect(0,n-1,256,n) );
inc(n);
end;
end;
У меня эта процедура работает в потоке, может из-за этого не хочет работать?
Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 5