В Делфи такого нету.
Сквозняк
Alex2013
Спасибо.
Вот два кода. Первый рабочий. Читает картинку через TBitmap, раскарашивает ее заданной палитрой цветов.
Второй нерабочий. Сделал чтение bmp файла как текстового файла.
Что-то не так с цветом или массивом, не могу понять. Буду рад, если поможете.
Само чтение bmp файла в этом коде правильное. Делал отрисовку тестовой картинки на форму через Canvas, работало.
Рабочий
- Код: Выделить всё
program Project1;
{$APPTYPE CONSOLE}
uses
Classes,
Graphics;
const
W=1392;
H=1032;
Var
X,Y,I:Integer;
Color:Tcolor;
type
RGB=Record
b,g,r: Byte;
End;
type
TPixels=Array[0..0] of RGB;
PPixels= ^TPixels;
var
Row: PPixels;
Palette: Array[0..255] of RGB;
Type
TGradients=Record
brightness: Byte;
Color: RGB;
end;
var
Gradients: Array[0..8] of TGradients;
TempBitMap:TBitMap;
xMin, yMin, xMax, yMax:integer;
Interval:Integer;
k:double;
I1,I2:Byte;
C1,C2:RGB;
Begin
Gradients[8].Color.r:=255;
Gradients[8].Color.g:=255;
Gradients[8].Color.b:=255;
Gradients[8].brightness:=255;
Gradients[7].Color.r:=255;
Gradients[7].Color.g:=16;
Gradients[7].Color.b:=0;
Gradients[7].brightness:=254;
Gradients[6].Color.r:=255;
Gradients[6].Color.g:=255;
Gradients[6].Color.b:=0;
Gradients[6].brightness:=196;
Gradients[5].Color.r:=0;
Gradients[5].Color.g:=255;
Gradients[5].Color.b:=0;
Gradients[5].brightness:=164;
Gradients[4].Color.r:=0;
Gradients[4].Color.g:=255;
Gradients[4].Color.b:=255;
Gradients[4].brightness:=134;
Gradients[3].Color.r:=0;
Gradients[3].Color.g:=0;
Gradients[3].Color.b:=255;
Gradients[3].brightness:=71;
Gradients[2].Color.r:=255;
Gradients[2].Color.g:=0;
Gradients[2].Color.b:=255;
Gradients[2].brightness:=40;
Gradients[1].Color.r:=0;
Gradients[1].Color.g:=0;
Gradients[1].Color.b:=0;
Gradients[1].brightness:=0;
Gradients[0].Color.r:=0;
Gradients[0].Color.g:=0;
Gradients[0].Color.b:=0;
Gradients[0].brightness:=8;
TempBitMap:=TBitmap.Create;
TempBitMap.PixelFormat:=pf24bit;
TempBitMap.Width:=W;
TempBitMap.Height:=H;
TempBitMap.LoadFromFile('33.BMP');
For Interval:=0 to High(Gradients)-1 do
begin
I1:=Gradients[Interval].brightness;
I2:=Gradients[Interval+1].Brightness;
C1:=Gradients[Interval].Color;
C2:=Gradients[Interval+1].Color;
For i:=i1 to i2 do
Begin
k:=(i-i1)/(i2-i1);
Palette[i].r:=Round(c1.r*(1-k)+c2.r*k);
Palette[i].g:=Round(c1.g*(1-k)+c2.g*k);
Palette[i].b:=Round(c1.b*(1-k)+c2.b*k);
End;
end;
For Y:=0 To H-1 Do
Begin
Row:=TempBitMap.Scanline[Y];
For X:=0 To W-1 Do
begin
COLOR:=TempBitMap.Canvas.Pixels[x,y];
Row^[X]:=Palette[Color];
end;
End;
TempBitMap.SaveToFile('33_OUT.bmp');
TempBitMap.Free;
READLN;
end.
А вот нерабочий
- Код: Выделить всё
program Project3;
{$APPTYPE CONSOLE}
uses
Classes,
Graphics;
const
W=1392;
H=1032;
Var
X,Y,I:Integer;
Color:Tcolor;
type
RGB=Record
b,g,r: Byte;
End;
type
TPixels=Array[0..0] of RGB;
PPixels= ^TPixels;
var
Row: PPixels;
Palette: Array[0..255] of RGB;
Type
TGradients=Record
brightness: Byte;
Color: RGB;
end;
var
Gradients: Array[0..8] of TGradients;
TempBitMap:TBitMap;
xMin, yMin, xMax, yMax:integer;
Interval:Integer;
k:double;
I1,I2:Byte;
C1,C2:RGB;
CONST
ICP : ARRAY [0..15] OF INTEGER =(0,3,2,6,1,5,4,8,7,12,10,14,9,13,11,15);
VAR
ICBMP,INWBMP,BRIS11,
ICXEKR,ICYEKR,
NWCW:INTEGER;
RGB1,RGB2,RGB3 : ARRAY [0..255] OF BYTE;
AXY:ARRAY[0..W,0..H] OF BYTE;
AXYRGB:ARRAY[0..W,0..H,1..3] OF BYTE;
F1:TEXT;
PROCEDURE BMP_BEG(VAR NF:TEXT;VAR NTG,NTW,NBG,NBP,NBGG:LONGINT);
VAR C:CHAR;
NBIT,NBYTE,A,I,N,SG,NCW,R:LONGINT;
LABEL 10,100;
BEGIN
FOR I:=1 TO 18 DO READ(NF,C);
A:=0;R:=1;
FOR I:=1 TO 4 DO BEGIN READ(NF,C);A:=A+R*ORD(C);R:=R*256;END;
NTG:=A;
A:=0;R:=1;
FOR I:=1 TO 4 DO BEGIN READ(NF,C);A:=A+R*ORD(C);R:=R*256;END;
NTW:=A;
A:=0;
FOR I:=1 TO 2 DO BEGIN READ(NF,C);A:=A+256*ORD(C);END;
A:=0;R:=1;
FOR I:=1 TO 2 DO BEGIN READ(NF,C);A:=A+R*ORD(C);R:=R*256;END;
NBP:=A;
A:=0;R:=1;
FOR I:=1 TO 4 DO BEGIN READ(NF,C);A:=A+R*ORD(C);R:=R*256;END;
SG:=A;
{ SG=A 'tip svatiq}
A:=0;R:=1;
FOR I:=1 TO 4 DO BEGIN READ(NF,C);A:=A+R*ORD(C);R:=R*256;END;
// NSG:=A;
{ NSG=A Ðàçìåð ñæàòèÿ}
A:=0;R:=1;
FOR I:=1 TO 4 DO BEGIN READ(NF,C);A:=A+R*ORD(C);R:=R*256;END;
// AMG:=A;
A:=0;R:=1;
FOR I:=1 TO 4 DO BEGIN READ(NF,C);A:=A+R*ORD(C);R:=R*256;END;
// AMW:=A;
A:=0;R:=1;
FOR I:=1 TO 4 DO BEGIN READ(NF,C);A:=A+R*ORD(C);R:=R*256;END;
NCW:=A;
{ NCW=A ×èñëî öâåòîâ}
A:=0;R:=1;
FOR I:=1 TO 4 DO BEGIN READ(NF,C);A:=A+R*ORD(C);R:=R*256;END;
// NWCW:=A;
{ NWCW=A ×èñëî âàæíûõ öâåòîâ}
N:=NCW;
IF N>0 THEN GOTO 10;
IF NBP=1 THEN N:=2;
IF NBP=4 THEN N:=16;
IF NBP=8 THEN N:=256;
{Êàðòà öâåòîâ RGB}
10: FOR I:=1 TO N DO BEGIN
READ(NF,C);RGB1[I-1]:=ORD(C);
READ(NF,C);RGB2[I-1]:=ORD(C);
READ(NF,C);RGB3[I-1]:=ORD(C);
READ(NF,C);
END;
N:=4*N;
IF SG<>0 THEN GOTO 100;
NBG:=ROUND(NTG/8*NBP);
NBGG:=TRUNC((NBG-1)/4)*4+4-NBG;
{ ÷èñëî áèò â ñòðîêå}
NBIT:=NTG*NBP;
NBYTE:=NBIT DIV 8;
IF NBIT MOD 8>0 THEN INC(NBYTE);
NBG:=NBYTE;
I:=NBYTE MOD 4;
IF I>0 THEN NBYTE:=NBYTE+4-I;
NBGG:=NBYTE-NBG;
100: END;{BMP_BEG}
PROCEDURE BMP_RISBMP(VAR NFBMP:TEXT;X0BMP,Y0BMP,DDBMP:SINGLE;INWBMP:INTEGER);
VAR II,J:INTEGER;
NBGG,ITG,A,L,R,ITX,I,NX,NY,IX,IY,NBG,NBP:LONGINT;C,CR,CG,CB:CHAR;
LABEL 98,99;
{ --}
PROCEDURE PUT(IX,IY,IC:INTEGER);
BEGIN
AXY[IX,IY]:=IC;
END;
{ --}
PROCEDURE PUTRGB(IX,IY,IR,IG,IB:INTEGER);
BEGIN
AXYRGB[IX,IY,1]:=IR;
AXYRGB[IX,IY,2]:=IG;
AXYRGB[IX,IY,3]:=IB;
END;
{ -------------}
BEGIN
ICBMP:=10;
BMP_BEG(NFBMP,NX,NY,NBG,NBP,NBGG);
FOR IY:=1 TO NY DO BEGIN
IX:=0;ITG:=0;J:=0;
// PUT(IX,IY,10);
FOR ITX:=1 TO NBG DO BEGIN
IF NBP=1 THEN BEGIN
READ(NFBMP,C);A:=ORD(C);L:=128;
FOR I:=1 TO 8 DO BEGIN
R:=TRUNC(A/L);A:=A-R*L;L:=ROUND(L/2);ITG:=ITG+1;
IF ITG<=NX THEN BEGIN
INC(IX);
IF (INWBMP=0) AND (R=0) OR
(INWBMP<>0) AND (R<>0) THEN PUT(IX,IY,ICBMP);
END;
END;
END ELSE
IF NBP=4 THEN BEGIN
READ(NFBMP,C);A:=ORD(C);L:=TRUNC(A/16);R:=A-16*L;
IF (INWBMP=0) THEN BEGIN
L:=ICP[L];R:=ICP[R];
END ELSE BEGIN
L:=16-ICP[L];R:=16-ICP[R];
END;
PUT(IX,IY,L);INC(IX);
PUT(IX,IY,R);INC(IX);
END ELSE
IF NBP=8 THEN BEGIN
READ(NFBMP,C);
J:=ORD(C);
IF (INWBMP=0) THEN BEGIN
PUTRGB(IX,IY,RGB1[J],RGB2[J],RGB3[J]);
END ELSE BEGIN
PUTRGB(IX,IY,256-RGB1[J],256-RGB2[J],256-RGB3[J]);
END;
INC(IX);
END ELSE
IF NBP=24 THEN BEGIN
READ(NFBMP,C);
INC(J);
IF J=1 THEN CR:=C;
IF J=2 THEN CG:=C;
IF J=3 THEN CB:=C;
IF J=3 THEN BEGIN
J:=0;
IF (INWBMP=0) THEN BEGIN
PUTRGB(IX,IY,ORD(CR),ORD(CG),ORD(CB));
END ELSE BEGIN
PUTRGB(IX,IY,256-ORD(CR),256-ORD(CG),256-ORD(CB));
END;
INC(IX);
END;
END;
END;{ITX}
FOR ITX:=1 TO NBGG DO READ(NFBMP,C);
END;{ITY}
98:
// CLOSE(NFBMP);
99: END;{BMP_RIS}
Begin
ASSIGNFILE(F1,'33.BMP');
RESET(F1);
BMP_RISBMP(F1,1,1,1,0);
closeFile(F1);
Gradients[8].Color.r:=255;
Gradients[8].Color.g:=255;
Gradients[8].Color.b:=255;
Gradients[8].brightness:=255;
Gradients[7].Color.r:=255;
Gradients[7].Color.g:=16;
Gradients[7].Color.b:=0;
Gradients[7].brightness:=254;
Gradients[6].Color.r:=255;
Gradients[6].Color.g:=255;
Gradients[6].Color.b:=0;
Gradients[6].brightness:=196;
Gradients[5].Color.r:=0;
Gradients[5].Color.g:=255;
Gradients[5].Color.b:=0;
Gradients[5].brightness:=164;
Gradients[4].Color.r:=0;
Gradients[4].Color.g:=255;
Gradients[4].Color.b:=255;
Gradients[4].brightness:=134;
Gradients[3].Color.r:=0;
Gradients[3].Color.g:=0;
Gradients[3].Color.b:=255;
Gradients[3].brightness:=71;
Gradients[2].Color.r:=255;
Gradients[2].Color.g:=0;
Gradients[2].Color.b:=255;
Gradients[2].brightness:=40;
Gradients[1].Color.r:=0;
Gradients[1].Color.g:=0;
Gradients[1].Color.b:=0;
Gradients[1].brightness:=0;
Gradients[0].Color.r:=0;
Gradients[0].Color.g:=0;
Gradients[0].Color.b:=0;
Gradients[0].brightness:=8;
TempBitMap:=TBitmap.Create;
TempBitMap.PixelFormat:=pf24bit;
TempBitMap.Width:=W;
TempBitMap.Height:=H;
For Interval:=0 to High(Gradients)-1 do
begin
I1:=Gradients[Interval].brightness;
I2:=Gradients[Interval+1].Brightness;
C1:=Gradients[Interval].Color;
C2:=Gradients[Interval+1].Color;
For i:=i1 to i2 do
Begin
k:=(i-i1)/(i2-i1);
Palette[i].r:=Round(c1.r*(1-k)+c2.r*k);
Palette[i].g:=Round(c1.g*(1-k)+c2.g*k);
Palette[i].b:=Round(c1.b*(1-k)+c2.b*k);
End;
end;
For Y:=0 To H-1 Do
Begin
Row:=TempBitMap.Scanline[Y];
For X:=0 To W-1 Do
begin
COLOR:=AXY[x,y];
Row^[X]:=Palette[Color];
end;
End;
TempBitMap.SaveToFile('44_OUT.bmp');
TempBitMap.Free;
READLN;
end.