Конференция "Media" » Обьеденить несколько .png в один [D7, WinXP]
 
  • Sergey_ko (23.01.10 17:57) [0]
    Здравствуйте мастера.
    Помогите как можно обьеденить несколько png картинок в один. При этом не потерять альфа канал.
  • antonn © (23.01.10 18:14) [1]
    как понимать "объеденить"?
  • Sergey_ko (23.01.10 18:17) [2]
    В смысле имеется куча картинок (последовательность) их надо обьеденить друг за другом в один файл. Пристроить к следующей. Если делать через copyrect() то теряется альфа канал.
  • Вася (23.01.10 18:28) [3]
    у вас есть спецификации формата png?если если есь - то я могу так попробовать сделать - преобразуем png в массив пикселей и просто собираем всё в новый битмап, а потом обратно в png.=)
  • Sergey_ko (23.01.10 18:29) [4]
    Чтобы было понятней:
    png.canvas.copyrect(rect(0,0,30,30),pngs.canvas,rect(0,0,30,30));
    png.canvas.copyrect(rect(30,0,60,30),pngs.canvas,rect(0,0,30,30));
    ....
    png.canvas.copyrect(rect(200,0,230,30),pngs.canvas,rect(0,0,30,30));

    вот типа того, но нужно всё это с альфа каналом.
    Помогите.
  • Sergey_ko (23.01.10 18:32) [5]
    У меня есть есть компонент pngimage
    Можно и через битмап без разници, главно альфа канал сохранить,
    если можно с примером.
  • Вася (23.01.10 18:44) [6]
    GDI вообще не умеет работать с альфа-каналом.он его всегда тупо стирает.а компонента pngimage у меня нету.

    вот GDI+ вроде могёт, но его у меня тоже нету.
  • Sergey_ko (23.01.10 18:48) [7]
    можно перевести в 32бит битмап, а вот как обратно собрать в пнг?
  • Вася (23.01.10 19:10) [8]
    ну вы же у нас счастливый обладатель компонента pngimage.=)))
    наверняка там это предусмотрено...)

    попробуйте поискать в яндексе по фразе "ScanLine, Делфи"
  • Sergey_ko (23.01.10 19:23) [9]
    procedure BitmapFileToPNG(const Source, Dest: String);
    var
     Bitmap: TBitmap;
     PNG: TPNGObject;
    begin
     Bitmap := TBitmap.Create;
     PNG := TPNGObject.Create;
     {In case something goes wrong, free booth Bitmap and PNG}
     try
       Bitmap.LoadFromFile(Source);
       PNG.Assign(Bitmap);    //Convert data into png
       PNG.SaveToFile(Dest);
     finally
       Bitmap.Free;
       PNG.Free;
     end
    end;
    простой пример, не работает так как хотелось бы.
    альфа канал не сохраняется.
  • Вася (23.01.10 19:27) [10]
    у меня нету TPNGObject (оно из этого pngimage?) и поэтому ничего не могу сказать.
    может скажете где его взять можно - тогда смогу думать что там не так...=)
  • Sergey_ko (23.01.10 19:34) [11]
    могу скинуть, давай е-мыло.
  • Вася (23.01.10 19:44) [12]
    Edgar_Wine@mail.ru
  • Sergey_ko (23.01.10 19:48) [13]
    Отправил.
  • antonn © (23.01.10 19:57) [14]
    дарю :)
    http://desksoft.ru/index.php?downloads=attachments&id=254 (465кб, zip)

    грубо, но вполне показательно :) Конвертим png в tbitmap и делаем что хотим
  • Sergey_ko (23.01.10 20:05) [15]
    Огромное спасибо antonn!!! То что нужно!!!
  • Вася (23.01.10 21:52) [16]
    кажется в этом pngimage не предусмотрена переделывание из битмапа с альфаканалом в png.

    ну вот как-то примерно так...хотя параметрам Xr и Yr нельзя задавать отрицательных значений,а то прога вылетит (надо будет ещё подумать над этим)

    Procedure Put32BitmapRectTo32Bitmap(Back, BMP: TBitmap; Xr, Yr: Integer);
    Type Line = array[0..1] of TRGBQuad; PLine=^Line;
    Var BackLine, BMPLine: PLine; x, y, Xend, Yend: Integer;
    Begin
    Xend:=Xr+BMP.Width-1;
    If Xend>=Back.Width Then Xend:=Back.Width-1;
    Yend:=Yr+BMP.Height-1;
    If Yend>=Back.Height Then Yend:=Back.Height-1;
    For y:=Yr To Yend Do
         Begin
         BackLine:=Back.ScanLine[y];
         BMPLine:=BMP.ScanLine[y-Yr];
         For x:=Xr To Xend Do
               Begin
               BackLine[x].rgbReserved:=BMPLine[x-Xr].rgbReserved;
               BackLine[x].rgbRed:=BMPLine[x-Xr].rgbRed;
               BackLine[x].rgbGreen:=BMPLine[x-Xr].rgbGreen;
               BackLine[x].rgbBlue:=BMPLine[x-Xr].rgbBlue;
               End;
         End;
    End;

  • Sergey_ko (24.01.10 12:38) [17]
    Спасибо Вася. В примере от антонн, есть всё что надо.
    Ещё раз спасибо за помощь.
 
Конференция "Media" » Обьеденить несколько .png в один [D7, WinXP]
Есть новые Нет новых   [120076   +28][b:0][p:0.001]