| Цитата | того я и спрашивал, как перегнать из одного формата в другой, необращая внимания на альфа канал
|
правильно, получится такая картинка, потому что ты не обращаешь внимания на альфаканал. А вот то, тчо ты хочешь - это называется "с учетом альфаканала". Более того, тут еще один фактор - сам фон, на который с помощью альфы оно и рисуется. В примере сделал просто одноцветный фон, для наглядности. Указываешь файл png, задаешь имя сохраняемого bmp и получаешь его с цветом указанного фона и картинкой поверх.
| Код | procedure RenderPNG2BMP(file_png,file_bmp:string; background_color:tcolor); const MaxPixelCountA = MaxInt div SizeOf(TRGBQuad); type PRGBAArray = ^TRGBAArray; TRGBAArray = array[0..MaxPixelCountA-1] of TRGBQuad; var Bt:TBitmap; PNB:TPngObject; RBT:PRGBAArray; aaa:pByteArray; x,y,tmp:integer; rc1, bc1, gc1:byte; begin bt:=TBitmap.Create; PNB:=TPngObject.Create; try PNB.LoadFromFile(file_png); pnb.CreateAlpha; bt.Assign(pnb); bt.PixelFormat:=pf32bit;
for y:=0 to bt.Height-1 do begin RBT:=bt.ScanLine[y]; aaa:=pnb.AlphaScanline[y]; for x:=0 to bt.Width-1 do begin RBT[x].rgbReserved:=aaa[x]; end; end;
rc1:=GetRValue(background_color); gc1:=GetGValue(background_color); bc1:=GetBValue(background_color);
for y:=0 to bt.Height-1 do begin RBT:=bt.ScanLine[y]; for x:=0 to bt.Width-1 do begin
tmp:=round((1-(RBT[x].rgbReserved/255))*rc1+(RBT[x].rgbReserved/255)*RBT[x].rgbRed); if tmp>255 then tmp:=255 else if tmp<0 then tmp:=0; RBT[x].rgbRed:=tmp;
tmp:=round((1-(RBT[x].rgbReserved/255))*gc1+(RBT[x].rgbReserved/255)*RBT[x].rgbGreen); if tmp>255 then tmp:=255 else if tmp<0 then tmp:=0; RBT[x].rgbGreen:=tmp;
tmp:=round((1-(RBT[x].rgbReserved/255))*bc1+(RBT[x].rgbReserved/255)*RBT[x].rgbBlue); if tmp>255 then tmp:=255 else if tmp<0 then tmp:=0; RBT[x].rgbBlue:=tmp; end; end;
bt.SaveToFile(file_bmp);
finally bt.Free; pnb.Free; end; end;
|
|