From bef8d9ba45d625e0bdcd8f08d2b06f72eb51c2ef Mon Sep 17 00:00:00 2001 From: Victor Westerlund Date: Fri, 20 Nov 2020 17:11:06 +0100 Subject: [PATCH 1/2] Draft --- Sheet.py | 61 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 61 insertions(+) create mode 100644 Sheet.py diff --git a/Sheet.py b/Sheet.py new file mode 100644 index 0000000..5b62fd1 --- /dev/null +++ b/Sheet.py @@ -0,0 +1,61 @@ +import json +from PIL import Image +from pathlib import Path + +# Create new sprite +class Sprite: + + def __init__(self,image,size): + self.image = Image.open(image).convert("RGBA") + + # Resize image to size[width,height] if nessesary + if(self.image.width != size[0] or self.image.height != size[1]): + self.resize() + + # Resize image without maintaining aspect ratio + def resize(self,resample=Image.BICUBIC): + rw = self.image.width + rh = self.image.height + + # Scale image width + if(rw != size[0]): + rw = int(self.image.height * self.image.width / size[0]) + + # Scale image height + if(rh != size[1]): + rh = int(self.image.width * size[1] / self.image.height) + + self.image = self.image.resize((rw,rh),resample) + +# -------------------------------- + +# Create new sheet of sprites +class Sheet: + + def __init__(self,folder = None): + self.sprites = [] + + # Auto-import sprite folder + if(folder): + self.path = Path(folder).glob("**/*.png") + self.sprites = [x for x in self.path] + + # Concatinate sprites vertically + def concat(self,size): + sheet = Image.new("RGBA",(size[0],size[1] * len(self.sprites))) + + for i, sprite in enumerate(self.sprites): + sheet.paste(Sprite(sprite,size).image,(0,size[1] * i)) + + return sheet + + # Add sprite by path + def add(self,path): + self.sprites.append(path) + + # Create and save spritesheet + def put(self,dest,size): + sheet = self.concat(size) + sheet.save(dest) + + print(len(self.sprites)) \ No newline at end of file From 96f98da9b87c2865d2b9d5416fe577cf08cc89c8 Mon Sep 17 00:00:00 2001 From: Victor Westerlund Date: Sun, 22 Nov 2020 18:07:16 +0100 Subject: [PATCH 2/2] 1.0.0 Moved lib into 'pysheeter/' and an import reference with '__init__.py'. Added example files --- .gitignore | 2 ++ __init__.py | 1 + example.py | 10 +++++++ example/1.png | Bin 0 -> 373 bytes example/2.png | Bin 0 -> 406 bytes example/3.png | Bin 0 -> 471 bytes example/4.png | Bin 0 -> 291 bytes example/5.png | Bin 0 -> 333 bytes example/6.png | Bin 0 -> 333 bytes example/7.png | Bin 0 -> 280 bytes example/8.png | Bin 0 -> 333 bytes example/9.png | Bin 0 -> 450 bytes Sheet.py => pysheeter/PySheeter.py | 45 +++++++++++++++++------------ 13 files changed, 39 insertions(+), 19 deletions(-) create mode 100644 .gitignore create mode 100644 __init__.py create mode 100644 example.py create mode 100644 example/1.png create mode 100644 example/2.png create mode 100644 example/3.png create mode 100644 example/4.png create mode 100644 example/5.png create mode 100644 example/6.png create mode 100644 example/7.png create mode 100644 example/8.png create mode 100644 example/9.png rename Sheet.py => pysheeter/PySheeter.py (58%) diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..82f1e02 --- /dev/null +++ b/.gitignore @@ -0,0 +1,2 @@ +__pycache__/ +example_* \ No newline at end of file diff --git a/__init__.py b/__init__.py new file mode 100644 index 0000000..acc8eac --- /dev/null +++ b/__init__.py @@ -0,0 +1 @@ +from lib import PySheeter \ No newline at end of file diff --git a/example.py b/example.py new file mode 100644 index 0000000..3fec735 --- /dev/null +++ b/example.py @@ -0,0 +1,10 @@ +from pysheeter import PySheeter + +# Load sprites from 'example/' +spritesheet = PySheeter.Sheet("example") + +# Create a vertical spritesheet with the dimensions 16x16 +spritesheet.put("example_v1616.png",(16,16)) + +# Create a horizontal spritesheet with the dimensions 16x32 +spritesheet.put("example_h1632.png",(16,32),False) \ No newline at end of file diff --git a/example/1.png b/example/1.png new file mode 100644 index 0000000000000000000000000000000000000000..0d6591b80ddde50cf39066e4b8a5a6d0717fbb70 GIT binary patch literal 373 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I%)r3-YQx4VAcwIy$lZxy-8q?;Kn_c~qpu?a z!^VE@KZ&eBK3jlKh%1l=f~Dy@&jTr@k|4j}{|ryJ8+ZYEoCO|{#S9F5he4R}c>anM zpx`S{7sn6}@3)hB`I;4YTE6~`ugbMt(%SVk|1?LulFaqbB{NTR^+Z(oE_(c=^`_t+ zmG*0=6s?q)lNA@7nzklZ`Tj!T&P4}`-6}8UdamZ9kb)2;)Y z7nYsTVo2cdV{lJk4w&_j$u60tZwBjn(F^6_&7RIX8V+2zq}d>Lq+s(wrt3n7SgU#K zLlmy{G8OJASmSW+-QT@UQfIUlu}W+y;ab2ygOyo)PJ-ASy@>1lw(I#aSR6g}0)5Tk M>FVdQ&MBb@0IuJSSpWb4 literal 0 HcmV?d00001 diff --git a/example/2.png b/example/2.png new file mode 100644 index 0000000000000000000000000000000000000000..536ccbcd86cae19c9c7ce85a339f591d23bb08ec GIT binary patch literal 406 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I%)r3-YQx4VAcwIy$lZxy-8q?;Kn_c~qpu?a z!^VE@KZ&eBK3jlKh%1l=f~Dy@&jTr@k|4j}{|ryJ8+ZYEoCO|{#S9F5he4R}c>anM zpn=?;E{-7{-ft%{@*P&-VZQypzRH2;h-X9TTa(O3OB^@MowCx_&*A9AaLq498b*nV zrE&e69*~+uBbIZw{Tc>z?Gwx!Z6Hw`Mq5O^ZT@(2wL9;~zzTD-!@t&iX zpXK!A#>Ic5V_$LlUbC}hV*6Rsp0qJvZ>G=V*$$oySf0%g($KQ!uqboLVEik!^4Pl2 zs;A;izUu#j82El)XL_{pJ#!iZd(rlfu?P4J7{52juDG%Ju|1Raw}$mR9`|Sef6`V| z(rh5rH8bGzLkFgf8IS#5@Pyz>&^e>B tl*P}GyZq*Uc9m}pR~yW4Fz4}GoEOgxanM zpn*P~E{-7{-ft(}E<3Ei!}9q5|Cdb?Jr`KtTzTs}yYj%LtgUKxm9hfjm*%)jPYs^6 zP~^~}tGhl#uUA>#9FVg&XnBFvt>E()#F%W87X49OKzTPG5*{dt4@M&huBa&2yDl_9yFO!YyLlu20(3eF4V2OL85uPk5kIVwZ%U?9v8H|S|GINpoN?X zkKs<|o0E6hTTf;TkXqG!Y_j6Be2KCeCNai8#a1ikRUDeu)~PJDgZHu@3v;BuxK1R) z*Lm{XJLU*TMjtxbaly@rG0`ziaY56h4HBF66{ literal 0 HcmV?d00001 diff --git a/example/4.png b/example/4.png new file mode 100644 index 0000000000000000000000000000000000000000..17d23683736430e783279d3cec58e81a637ea800 GIT binary patch literal 291 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I%)r3-YQx4VAcwIy$lZxy-8q?;Kn_c~qpu?a z!^VE@KZ&eBK3jlKh%1l=f~Dy@&jTr@k|4j}{|ryJ8+ZYEoCO|{#S9F5he4R}c>anM zpx_Ko7sn6}@3)hhotTa6TjDkS6k;*=~bT;sYhS df@+0htf!RugqG*t*#~qZgQu&X%Q~loCIEKGV+{ZR literal 0 HcmV?d00001 diff --git a/example/5.png b/example/5.png new file mode 100644 index 0000000000000000000000000000000000000000..ee6ad7f93e523b8a9c40a3f1c9289efd3effbd2f GIT binary patch literal 333 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I%)r3-YQx4VAcwIy$lZxy-8q?;Kn_c~qpu?a z!^VE@KZ&eBK3jlKh%1l=f~Dy@&jTr@k|4j}{|ryJ8+ZYEoCO|{#S9F5he4R}c>anM zpx_}-7sn6}@3)gq^Bqy(VZQzU|I52p%)I@f3%SLQ$Y?#b5OcEis}N|nv#MKZeTe&V zCr9+sWEVk&3dPcVwm9jTQCCwM#`Z!Ii0Tkj#2wnNBXM89XwM8@5#4+z>dct}cf zBuK>ac1+pW$kDfAy=B>f9n5;1Nw%+)78&qol`;+03xPuS^xk5 literal 0 HcmV?d00001 diff --git a/example/6.png b/example/6.png new file mode 100644 index 0000000000000000000000000000000000000000..ee6ad7f93e523b8a9c40a3f1c9289efd3effbd2f GIT binary patch literal 333 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I%)r3-YQx4VAcwIy$lZxy-8q?;Kn_c~qpu?a z!^VE@KZ&eBK3jlKh%1l=f~Dy@&jTr@k|4j}{|ryJ8+ZYEoCO|{#S9F5he4R}c>anM zpx_}-7sn6}@3)gq^Bqy(VZQzU|I52p%)I@f3%SLQ$Y?#b5OcEis}N|nv#MKZeTe&V zCr9+sWEVk&3dPcVwm9jTQCCwM#`Z!Ii0Tkj#2wnNBXM89XwM8@5#4+z>dct}cf zBuK>ac1+pW$kDfAy=B>f9n5;1Nw%+)78&qol`;+03xPuS^xk5 literal 0 HcmV?d00001 diff --git a/example/7.png b/example/7.png new file mode 100644 index 0000000000000000000000000000000000000000..ab7535e9843f4da8bdede03a79097e186bab32ce GIT binary patch literal 280 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I%)r3-YQx4VAcwIy$lZxy-8q?;Kn_c~qpu?a z!^VE@KZ&eBK3jlKh%1l=f~Dy@&jTr@k|4j}{|ryJ8+ZYEoCO|{#S9F5he4R}c>anM zpkS}3i(`m~_uEO)d<_Z$%n$!fpSJYq8ij-GM~;-(6=;?w@hDC@EZ`JXJgL0-poQ$D zV_|IH+nAV)Q*U~H^$nOIwuApI%e$YY8$K(nm>K!NUYRGl*_uhKq3ZqurW@RQvRIb| zb03gr6m8&IaL@eDVgsip)uxjBzcxIMQ20<1_sK({QL&NbSkggOl?vUCLgv1YdanM zpx_}-7sn6}@3)gq^Bqy(VZQzU|I52p%)I@f3%SLQ$Y?#b5OcEis}N|nv#MKZeTe&V zCr9+sWEVk&3dPcVwm9jTQCCwM#`Z!Ii0Tkj#2wnNBXM89XwM8@5#4+z>dct}cf zBuK>ac1+pW$kDfAy=B>f9n5;1Nw%+)78&qol`;+03xPuS^xk5 literal 0 HcmV?d00001 diff --git a/example/9.png b/example/9.png new file mode 100644 index 0000000000000000000000000000000000000000..3068c1be9055e1bda3b1750ad48d2920639509ff GIT binary patch literal 450 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I%)r3-YQx4VAcwIy$lZxy-8q?;Kn_c~qpu?a z!^VE@KZ&eBK3jlKh%1l=f~Dy@&jTr@k|4j}{|ryJ8+ZYEoCO|{#S9F5he4R}c>anM zpn>L|E{-7{-ft(}?mKM2;WGRG|Cdq{IR`A3O}E){YT~TE2KGw z?BTi@CN@8gI7<8733$}t_QLUCZF6(=L6x_HLcgjTsVlQ`5&g%bBJSRnA|P*{R%lL7ZZ50=SN zI}>=cm)~hJVEJV&WTEx9C!47^f%R|MF_i$PgrI{`;+!03bbc_ZYh<)U9*Er7WYa9z z@^S4RJ(tJ4iW1W~?rkVKRnKAluF;$A*8V6KbIqlVY