-
Здравствуйте мастера. Помогите как можно обьеденить несколько png картинок в один. При этом не потерять альфа канал.
-
как понимать "объеденить"?
-
В смысле имеется куча картинок (последовательность) их надо обьеденить друг за другом в один файл. Пристроить к следующей. Если делать через copyrect() то теряется альфа канал.
-
у вас есть спецификации формата png?если если есь - то я могу так попробовать сделать - преобразуем png в массив пикселей и просто собираем всё в новый битмап, а потом обратно в png.=)
-
Чтобы было понятней: 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));
вот типа того, но нужно всё это с альфа каналом. Помогите.
-
У меня есть есть компонент pngimage Можно и через битмап без разници, главно альфа канал сохранить, если можно с примером.
-
GDI вообще не умеет работать с альфа-каналом.он его всегда тупо стирает.а компонента pngimage у меня нету.
вот GDI+ вроде могёт, но его у меня тоже нету.
-
можно перевести в 32бит битмап, а вот как обратно собрать в пнг?
-
ну вы же у нас счастливый обладатель компонента pngimage.=))) наверняка там это предусмотрено...)
попробуйте поискать в яндексе по фразе "ScanLine, Делфи"
-
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; простой пример, не работает так как хотелось бы. альфа канал не сохраняется.
-
у меня нету TPNGObject (оно из этого pngimage?) и поэтому ничего не могу сказать. может скажете где его взять можно - тогда смогу думать что там не так...=)
-
могу скинуть, давай е-мыло.
-
Edgar_Wine@mail.ru
-
Отправил.
-
-
Огромное спасибо antonn!!! То что нужно!!!
-
кажется в этом 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;
-
Спасибо Вася. В примере от антонн, есть всё что надо. Ещё раз спасибо за помощь.
|