Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Звук, графика и видео > работа с pngimage


Автор: igorx86 20.7.2009, 01:00
Доброго времени суток!

Не могли бы подсказать, как получить доступ к пикселам картинки необращая внимание на альфа канал?

Заранее спасибо!

Автор: Alexeis 20.7.2009, 09:27
Цитата(igorx86 @  20.7.2009,  00:00 Найти цитируемый пост)
Не могли бы подсказать, как получить доступ к пикселам картинки необращая внимание на альфа канал?

  Насколько я помню у него есть 2 свойства Scanline для основного цвета и AlpaScanline для прозрачности, аналогично классу TBitmap.

Автор: igorx86 20.7.2009, 17:07
а если альфа канал выступает в виде градиента? то так быть?

Автор: AntonN 20.7.2009, 21:02
если не нужно обращать внимания на альфаканал, то не все ли равно как он выглядит? smile

Автор: igorx86 21.7.2009, 00:42
просто мне нужно преобразовать png в bmp необращая внимания на альфа канал

Автор: AntonN 21.7.2009, 07:52
ну и переводи, зачем тогда про градиент-альфу спрашиваешь? smile
Код

var PNB:TPngObject; b1:TBitmap;
begin
  b1:=TBitmap.Create;
  PNB:=TPngObject.Create;
  try
      PNB.LoadFromFile('c:\1.png');
      pnb.CreateAlpha;
      b1.Assign(pnb);
  finally
    b1.Free;
    PNB.Free;
   end;

Автор: igorx86 23.7.2009, 21:34
Цитата(AntonN @ 21.7.2009,  07:52)
ну и переводи, зачем тогда про градиент-альфу спрашиваешь? smile
Код

var PNB:TPngObject; b1:TBitmap;
begin
  b1:=TBitmap.Create;
  PNB:=TPngObject.Create;
  try
      PNB.LoadFromFile('c:\1.png');
      pnb.CreateAlpha;
      b1.Assign(pnb);
  finally
    b1.Free;
    PNB.Free;
   end;

если использовать этот код, то из такой картинки http://ipicture.ru/ 
получается такая 
http://ipicture.ru/

того я и спрашивал, как перегнать из одного формата в другой, необращая внимания на альфа канал

Автор: AntonN 23.7.2009, 22:57
Цитата

того я и спрашивал, как перегнать из одного формата в другой, необращая внимания на альфа канал 

правильно, получится такая картинка, потому что ты не обращаешь внимания на альфаканал.
А вот то, тчо ты хочешь - это называется "с учетом альфаканала". Более того, тут еще один фактор - сам фон, на который с помощью альфы оно и рисуется.
В примере сделал просто одноцветный фон, для наглядности. Указываешь файл 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;

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)