├── .gitignore ├── Microsoft.VC90.CRT ├── Microsoft.VC90.CRT.manifest ├── msvcm90.dll ├── msvcp90.dll └── msvcr90.dll ├── README ├── build.bat ├── cache.py ├── clean.bat ├── core.py ├── icons ├── align-center.png ├── align-left.png ├── align-right.png ├── bigger.png ├── exit.png ├── icon.ico ├── minus.png ├── new.png ├── open.png ├── plus.png ├── save.png └── smaller.png ├── images ├── 10-Guy.jpg ├── Advice-Dog.jpg ├── Advice-God.jpg ├── Advice-Yoda.jpg ├── Ancient-Aliens.jpg ├── Annoying-Childhood-Friend.jpg ├── Annoying-Facebook-Girl.jpg ├── Anti-Joke-Chicken.jpg ├── Art-Student-Owl.jpg ├── Baby-Godfather.jpg ├── Bad-Advice-Cat.jpg ├── Bad-Joke-Eel.jpg ├── Bad-Luck-Brian.jpg ├── Bear-Grylls.jpg ├── Blank-Colored-Background.jpg ├── Brace-Yourselves-X-is-Coming.jpg ├── Business-Cat.jpg ├── Butthurt-Dweller.jpg ├── Chemistry-Cat.jpg ├── College-Freshman.jpg ├── Computer-Guy.jpg ├── Confession-Bear.jpg ├── Conspiracy-Keanu.jpg ├── Courage-Wolf.jpg ├── Crazy-Girlfriend-Praying-Mantis.jpg ├── Creepy-Condescending-Wonka.jpg ├── Depression-Dog.jpg ├── Downvoting-Roman.jpg ├── Drunk-Baby.jpg ├── Dwight-Schrute.jpg ├── Ermahgerd-Berks.jpg ├── Evil-Cows.jpg ├── Family-Tech-Support-Guy.jpg ├── First-World-Problems-Cat.jpg ├── First-World-Problems.jpg ├── Fk-Yeah.jpg ├── Forever-Alone.jpg ├── Foul-Bachelor-Frog.jpg ├── Foul-Bachelorette-Frog.jpg ├── Futurama-Fry.jpg ├── Futurama-Zoidberg.jpg ├── Gasp-Rage-Face.jpg ├── Good-Guy-Greg.jpg ├── Grandma-Finds-The-Internet.jpg ├── Hawkward.jpg ├── Helpful-Tyler-Durden.jpg ├── High-Expectations-Asian-Father.jpg ├── Hipster-Barista.jpg ├── Hipster-Kitty.jpg ├── I-Have-No-Idea-What-I-Am-Doing.jpg ├── Idiot-Nerd-Girl.jpg ├── Ill-Just-Wait-Here.jpg ├── Insanity-Wolf.jpg ├── Joseph-Ducreux.jpg ├── Karate-Kyle.jpg ├── LOL-Guy.jpg ├── Lame-Pun-Coon.jpg ├── Lazy-College-Senior.jpg ├── Matrix-Morpheus.jpg ├── Men-Laughing.jpg ├── Musically-Oblivious-8th-Grader.jpg ├── Neil-deGrasse-Tyson.jpg ├── Oh-No.jpg ├── One-Does-Not-Simply.jpg ├── Ordinary-Muslim-Man.jpg ├── Original-I-Lied.jpg ├── Overly-Attached-Girlfriend.jpg ├── PTSD-Clarinet-Boy.jpg ├── Paranoid-Parrot.jpg ├── Patriotic-Eagle.jpg ├── Pedobear.jpg ├── Philosoraptor.jpg ├── Pickup-Line-Panda.jpg ├── Priority-Peter.jpg ├── Put-It-Somewhere-Else-Patrick.jpg ├── Question-Rage-Face.jpg ├── Rasta-Science-Teacher.jpg ├── Redditors-Wife.jpg ├── Redneck-Randal.jpg ├── Rich-Raven.jpg ├── Sad-X-All-The-Y.jpg ├── Say-That-Again-I-Dare-You.jpg ├── Scumbag-Brain.jpg ├── Scumbag-Minecraft.jpg ├── Scumbag-Redditor.jpg ├── Scumbag-Steve.jpg ├── Sexually-Oblivious-Rhino.jpg ├── Sheltering-Suburban-Mom.jpg ├── Shut-Up-And-Take-My-Money-Fry.jpg ├── Skeptical-Baby.jpg ├── Slowpoke.jpg ├── Socially-Awesome-Awkward-Penguin.jpg ├── Socially-Awesome-Penguin.jpg ├── Socially-Awkward-Penguin.jpg ├── Stoner-Dog.jpg ├── Success-Kid.jpg ├── Successful-Black-Man.jpg ├── Sudden-Clarity-Clarence.jpg ├── Surprised-Coala.jpg ├── Tech-Impaired-Duck.jpg ├── The-Most-Interesting-Cat-In-The-World.jpg ├── The-Most-Interesting-Man-In-The-World.jpg ├── Third-World-Skeptical-Kid.jpg ├── Third-World-Success-Kid.jpg ├── Too-Damn-High.jpg ├── Troll-Face-Colored.jpg ├── True-Story.jpg ├── Unhelpful-High-School-Teacher.jpg ├── Vengeance-Dad.jpg ├── We-Will-Rebuild.jpg ├── X-All-The-Y.jpg ├── Y-U-No.jpg ├── Yao-Ming.jpg └── Yo-Dawg-Heard-You.jpg ├── installer.iss ├── main.py └── setup.py /.gitignore: -------------------------------------------------------------------------------- 1 | *.pyd 2 | *.pyc 3 | *.pyo 4 | *.tmp 5 | *.bak 6 | *~ 7 | 8 | -------------------------------------------------------------------------------- /Microsoft.VC90.CRT/Microsoft.VC90.CRT.manifest: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | 5 | KSaO8M0iCtPF6YEr79P1dZsnomY= ojDmTgpYMFRKJYkPcM6ckpYkWUU= tVogb8kezDre2mXShlIqpp8ErIg= 6 | -------------------------------------------------------------------------------- /Microsoft.VC90.CRT/msvcm90.dll: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fogleman/pyMeme/9336888a28399f6e96ef0d3c9cee077c082e3064/Microsoft.VC90.CRT/msvcm90.dll -------------------------------------------------------------------------------- /Microsoft.VC90.CRT/msvcp90.dll: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fogleman/pyMeme/9336888a28399f6e96ef0d3c9cee077c082e3064/Microsoft.VC90.CRT/msvcp90.dll -------------------------------------------------------------------------------- /Microsoft.VC90.CRT/msvcr90.dll: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fogleman/pyMeme/9336888a28399f6e96ef0d3c9cee077c082e3064/Microsoft.VC90.CRT/msvcr90.dll -------------------------------------------------------------------------------- /README: -------------------------------------------------------------------------------- 1 | pyMeme is the official Python port of iMeme, a meme generator for Mac OS X. 2 | 3 | pyMeme has been tested on Windows and Mac OS X but should also work on Linux. 4 | 5 | http://www.michaelfogleman.com/imeme/ 6 | 7 | * Over 50 built-in templates. 8 | * Enter your own header and footer text. 9 | * Adjustable text size and alignment. 10 | * Use your own images. 11 | * Save as JPG. 12 | * Works on Windows XP and up. 13 | -------------------------------------------------------------------------------- /build.bat: -------------------------------------------------------------------------------- 1 | python setup.py 2 | "C:\Program Files (x86)\Inno Setup 5\Compil32.exe" /cc installer.iss 3 | -------------------------------------------------------------------------------- /cache.py: -------------------------------------------------------------------------------- 1 | import wx 2 | import urllib2 3 | import os 4 | from StringIO import StringIO 5 | class Cache(object): 6 | def __init__(self): 7 | self.cache = {} 8 | def get_bitmap(self, key): 9 | if key is None or isinstance(key, wx.Bitmap): 10 | return key 11 | if key not in self.cache: 12 | if os.path.exists(key): 13 | self.cache[key] = wx.Bitmap(key) 14 | else: 15 | fp = urllib2.urlopen(key) 16 | data = fp.read() 17 | fp.close() 18 | img = wx.ImageFromStream(StringIO(data)) 19 | self.cache[key] = img.ConvertToBitmap() 20 | return self.cache[key] 21 | def get_color(self, key): 22 | if key is None or isinstance(key, wx.Colour): 23 | return key 24 | if key not in self.cache: 25 | self.cache[key] = wx.Colour(*key) 26 | return self.cache[key] 27 | def get_font(self, key): 28 | if key is None or isinstance(key, wx.Font): 29 | return key 30 | if key not in self.cache: 31 | self.cache[key] = self.make_font(key) 32 | return self.cache[key] 33 | def make_font(self, key): 34 | face, size, bold, italic, underline = key 35 | family = wx.FONTFAMILY_DEFAULT 36 | style = wx.FONTSTYLE_ITALIC if italic else wx.FONTSTYLE_NORMAL 37 | weight = wx.FONTWEIGHT_BOLD if bold else wx.FONTWEIGHT_NORMAL 38 | font = wx.Font(size, family, style, weight, underline, face) 39 | return font 40 | 41 | DEFAULT_CACHE = Cache() 42 | 43 | def get_bitmap(key): 44 | return DEFAULT_CACHE.get_bitmap(key) 45 | 46 | def get_color(key): 47 | return DEFAULT_CACHE.get_color(key) 48 | 49 | def get_font(key): 50 | return DEFAULT_CACHE.get_font(key) 51 | -------------------------------------------------------------------------------- /clean.bat: -------------------------------------------------------------------------------- 1 | rmdir /S /Q build 2 | rmdir /S /Q dist 3 | rmdir /S /Q installer 4 | -------------------------------------------------------------------------------- /core.py: -------------------------------------------------------------------------------- 1 | import cache 2 | import re 3 | import wx 4 | 5 | # Constants 6 | LEFT = 1 7 | RIGHT = 2 8 | CENTER = 3 9 | 10 | # Functions 11 | def font(face='', size=12, bold=False, italic=False, underline=False): 12 | return (face, size, bold, italic, underline) 13 | 14 | def word_wrap(dc, width, text): 15 | lines = [] 16 | pattern = re.compile(r'(\s+)') 17 | lookup = dict((c, dc.GetTextExtent(c)[0]) for c in set(text)) 18 | for line in text.splitlines(): 19 | tokens = pattern.split(line) 20 | tokens.append('') 21 | widths = [sum(lookup[c] for c in token) for token in tokens] 22 | start, total = 0, 0 23 | for index in xrange(0, len(tokens), 2): 24 | if total + widths[index] > width: 25 | end = index + 2 if index == start else index 26 | lines.append(''.join(tokens[start:end])) 27 | start, total = end, 0 28 | if end == index + 2: 29 | continue 30 | total += widths[index] + widths[index + 1] 31 | if start < len(tokens): 32 | lines.append(''.join(tokens[start:])) 33 | lines = [line.strip() for line in lines] 34 | return lines or [''] 35 | 36 | def get_dc(): 37 | return wx.MemoryDC(wx.EmptyBitmap(1, 1)) 38 | 39 | # Classes 40 | class Control(object): 41 | def __init__(self, **kwargs): 42 | kwargs.setdefault('position', (0, 0)) 43 | kwargs.setdefault('anchor', (0, 0)) 44 | for name, value in kwargs.items(): 45 | setattr(self, name, value) 46 | def get_computed_position(self, size): 47 | ww, wh = size 48 | ax, ay = self.anchor 49 | x, y = self.position 50 | w, h = self.get_size() 51 | x = ww + x if x < 0 else x 52 | y = wh + y if y < 0 else y 53 | x -= w * ax 54 | y -= h * ay 55 | return (x, y) 56 | def render(self, dc, size, offset): 57 | dx, dy = offset 58 | x, y = self.get_computed_position(size) 59 | x, y = x + dx, y + dy 60 | w, h = self.get_size() 61 | dc.SetDeviceOrigin(x, y) 62 | dc.SetClippingRegion(0, 0, w, h) 63 | self.draw(dc) 64 | dc.DestroyClippingRegion() 65 | dc.SetDeviceOrigin(0, 0) 66 | def get_size(self): 67 | raise NotImplementedError 68 | def draw(self, dc): 69 | raise NotImplementedError 70 | 71 | class Page(object): 72 | def __init__(self): 73 | self.controls = [] 74 | def add(self, control, position=None, anchor=None): 75 | if position: 76 | control.position = position 77 | if anchor: 78 | control.anchor = anchor 79 | self.controls.append(control) 80 | def render(self, dc, size, offset): 81 | for control in self.controls: 82 | control.render(dc, size, offset) 83 | 84 | class Bitmap(Control): 85 | def __init__(self, bitmap, **kwargs): 86 | super(Bitmap, self).__init__(**kwargs) 87 | self.bitmap = bitmap 88 | def get_size(self): 89 | bitmap = cache.get_bitmap(self.bitmap) 90 | return bitmap.GetSize() 91 | def draw(self, dc): 92 | bitmap = cache.get_bitmap(self.bitmap) 93 | dc.DrawBitmap(bitmap, 0, 0, True) 94 | 95 | class Text(Control): 96 | def __init__(self, label, width, **kwargs): 97 | kwargs.setdefault('alignment', LEFT) 98 | kwargs.setdefault('color', (0, 0, 0)) 99 | kwargs.setdefault('font', font()) 100 | kwargs.setdefault('shadow', None) 101 | kwargs.setdefault('max_height', None) 102 | kwargs.setdefault('line_offset', 0) 103 | kwargs.setdefault('border_color', None) 104 | kwargs.setdefault('border_size', 0) 105 | super(Text, self).__init__(**kwargs) 106 | self.label = label 107 | self.width = width 108 | height = self.compute_height() 109 | if self.max_height is not None: 110 | height = min(height, self.max_height) 111 | self.height = height 112 | def get_size(self): 113 | return (self.width, self.height) 114 | def get_lines(self, dc=None): 115 | dc = dc or get_dc() 116 | dc.SetFont(cache.get_font(self.font)) 117 | lines = word_wrap(dc, self.width, self.label) 118 | lines = [line or ' ' for line in lines] 119 | return lines 120 | def compute_height(self): 121 | dc = get_dc() 122 | lines = self.get_lines(dc) 123 | height = sum(dc.GetTextExtent(line)[1] for line in lines) 124 | return height 125 | def draw_text(self, dc, text, x, y): 126 | color = cache.get_color(self.color) 127 | shadow_color = cache.get_color(self.shadow) 128 | border_color = cache.get_color(self.border_color) 129 | p = self.border_size 130 | if shadow_color is not None: 131 | dc.SetTextForeground(shadow_color) 132 | dc.DrawText(text, x + p + 1, y + p + 1) 133 | if border_color is not None: 134 | dc.SetTextForeground(border_color) 135 | for dy in xrange(-p, p + 1): 136 | for dx in xrange(-p, p + 1): 137 | if dx * dx + dy * dy > p * p: 138 | continue 139 | dc.DrawText(text, x + dx, y + dy) 140 | dc.SetTextForeground(color) 141 | dc.DrawText(text, x, y) 142 | def draw(self, dc): 143 | dc.SetFont(cache.get_font(self.font)) 144 | lines = self.get_lines(dc) 145 | lines = lines[self.line_offset:] 146 | padding, _ = dc.GetTextExtent(' ') 147 | y = 0 148 | for line in lines: 149 | tw, th = dc.GetTextExtent(line) 150 | if y + th > self.height: 151 | break 152 | if self.alignment == LEFT: 153 | x = padding 154 | elif self.alignment == RIGHT: 155 | x = self.width - tw - padding 156 | else: 157 | x = self.width / 2 - tw / 2 158 | self.draw_text(dc, line, x, y) 159 | y += th 160 | -------------------------------------------------------------------------------- /icons/align-center.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fogleman/pyMeme/9336888a28399f6e96ef0d3c9cee077c082e3064/icons/align-center.png -------------------------------------------------------------------------------- /icons/align-left.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fogleman/pyMeme/9336888a28399f6e96ef0d3c9cee077c082e3064/icons/align-left.png -------------------------------------------------------------------------------- /icons/align-right.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fogleman/pyMeme/9336888a28399f6e96ef0d3c9cee077c082e3064/icons/align-right.png -------------------------------------------------------------------------------- /icons/bigger.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fogleman/pyMeme/9336888a28399f6e96ef0d3c9cee077c082e3064/icons/bigger.png -------------------------------------------------------------------------------- /icons/exit.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fogleman/pyMeme/9336888a28399f6e96ef0d3c9cee077c082e3064/icons/exit.png -------------------------------------------------------------------------------- /icons/icon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fogleman/pyMeme/9336888a28399f6e96ef0d3c9cee077c082e3064/icons/icon.ico -------------------------------------------------------------------------------- /icons/minus.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fogleman/pyMeme/9336888a28399f6e96ef0d3c9cee077c082e3064/icons/minus.png -------------------------------------------------------------------------------- /icons/new.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fogleman/pyMeme/9336888a28399f6e96ef0d3c9cee077c082e3064/icons/new.png -------------------------------------------------------------------------------- /icons/open.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fogleman/pyMeme/9336888a28399f6e96ef0d3c9cee077c082e3064/icons/open.png -------------------------------------------------------------------------------- /icons/plus.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fogleman/pyMeme/9336888a28399f6e96ef0d3c9cee077c082e3064/icons/plus.png -------------------------------------------------------------------------------- /icons/save.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fogleman/pyMeme/9336888a28399f6e96ef0d3c9cee077c082e3064/icons/save.png -------------------------------------------------------------------------------- /icons/smaller.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fogleman/pyMeme/9336888a28399f6e96ef0d3c9cee077c082e3064/icons/smaller.png -------------------------------------------------------------------------------- /images/10-Guy.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fogleman/pyMeme/9336888a28399f6e96ef0d3c9cee077c082e3064/images/10-Guy.jpg -------------------------------------------------------------------------------- /images/Advice-Dog.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fogleman/pyMeme/9336888a28399f6e96ef0d3c9cee077c082e3064/images/Advice-Dog.jpg -------------------------------------------------------------------------------- /images/Advice-God.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fogleman/pyMeme/9336888a28399f6e96ef0d3c9cee077c082e3064/images/Advice-God.jpg -------------------------------------------------------------------------------- /images/Advice-Yoda.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fogleman/pyMeme/9336888a28399f6e96ef0d3c9cee077c082e3064/images/Advice-Yoda.jpg -------------------------------------------------------------------------------- /images/Ancient-Aliens.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fogleman/pyMeme/9336888a28399f6e96ef0d3c9cee077c082e3064/images/Ancient-Aliens.jpg -------------------------------------------------------------------------------- /images/Annoying-Childhood-Friend.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fogleman/pyMeme/9336888a28399f6e96ef0d3c9cee077c082e3064/images/Annoying-Childhood-Friend.jpg -------------------------------------------------------------------------------- /images/Annoying-Facebook-Girl.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fogleman/pyMeme/9336888a28399f6e96ef0d3c9cee077c082e3064/images/Annoying-Facebook-Girl.jpg -------------------------------------------------------------------------------- /images/Anti-Joke-Chicken.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fogleman/pyMeme/9336888a28399f6e96ef0d3c9cee077c082e3064/images/Anti-Joke-Chicken.jpg -------------------------------------------------------------------------------- /images/Art-Student-Owl.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fogleman/pyMeme/9336888a28399f6e96ef0d3c9cee077c082e3064/images/Art-Student-Owl.jpg -------------------------------------------------------------------------------- /images/Baby-Godfather.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fogleman/pyMeme/9336888a28399f6e96ef0d3c9cee077c082e3064/images/Baby-Godfather.jpg -------------------------------------------------------------------------------- /images/Bad-Advice-Cat.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fogleman/pyMeme/9336888a28399f6e96ef0d3c9cee077c082e3064/images/Bad-Advice-Cat.jpg -------------------------------------------------------------------------------- /images/Bad-Joke-Eel.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fogleman/pyMeme/9336888a28399f6e96ef0d3c9cee077c082e3064/images/Bad-Joke-Eel.jpg -------------------------------------------------------------------------------- /images/Bad-Luck-Brian.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fogleman/pyMeme/9336888a28399f6e96ef0d3c9cee077c082e3064/images/Bad-Luck-Brian.jpg -------------------------------------------------------------------------------- /images/Bear-Grylls.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fogleman/pyMeme/9336888a28399f6e96ef0d3c9cee077c082e3064/images/Bear-Grylls.jpg -------------------------------------------------------------------------------- /images/Blank-Colored-Background.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fogleman/pyMeme/9336888a28399f6e96ef0d3c9cee077c082e3064/images/Blank-Colored-Background.jpg -------------------------------------------------------------------------------- /images/Brace-Yourselves-X-is-Coming.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fogleman/pyMeme/9336888a28399f6e96ef0d3c9cee077c082e3064/images/Brace-Yourselves-X-is-Coming.jpg -------------------------------------------------------------------------------- /images/Business-Cat.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fogleman/pyMeme/9336888a28399f6e96ef0d3c9cee077c082e3064/images/Business-Cat.jpg -------------------------------------------------------------------------------- /images/Butthurt-Dweller.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fogleman/pyMeme/9336888a28399f6e96ef0d3c9cee077c082e3064/images/Butthurt-Dweller.jpg -------------------------------------------------------------------------------- /images/Chemistry-Cat.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fogleman/pyMeme/9336888a28399f6e96ef0d3c9cee077c082e3064/images/Chemistry-Cat.jpg -------------------------------------------------------------------------------- /images/College-Freshman.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fogleman/pyMeme/9336888a28399f6e96ef0d3c9cee077c082e3064/images/College-Freshman.jpg -------------------------------------------------------------------------------- /images/Computer-Guy.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fogleman/pyMeme/9336888a28399f6e96ef0d3c9cee077c082e3064/images/Computer-Guy.jpg -------------------------------------------------------------------------------- /images/Confession-Bear.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fogleman/pyMeme/9336888a28399f6e96ef0d3c9cee077c082e3064/images/Confession-Bear.jpg -------------------------------------------------------------------------------- /images/Conspiracy-Keanu.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fogleman/pyMeme/9336888a28399f6e96ef0d3c9cee077c082e3064/images/Conspiracy-Keanu.jpg -------------------------------------------------------------------------------- /images/Courage-Wolf.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fogleman/pyMeme/9336888a28399f6e96ef0d3c9cee077c082e3064/images/Courage-Wolf.jpg -------------------------------------------------------------------------------- /images/Crazy-Girlfriend-Praying-Mantis.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fogleman/pyMeme/9336888a28399f6e96ef0d3c9cee077c082e3064/images/Crazy-Girlfriend-Praying-Mantis.jpg -------------------------------------------------------------------------------- /images/Creepy-Condescending-Wonka.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fogleman/pyMeme/9336888a28399f6e96ef0d3c9cee077c082e3064/images/Creepy-Condescending-Wonka.jpg -------------------------------------------------------------------------------- /images/Depression-Dog.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fogleman/pyMeme/9336888a28399f6e96ef0d3c9cee077c082e3064/images/Depression-Dog.jpg -------------------------------------------------------------------------------- /images/Downvoting-Roman.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fogleman/pyMeme/9336888a28399f6e96ef0d3c9cee077c082e3064/images/Downvoting-Roman.jpg -------------------------------------------------------------------------------- /images/Drunk-Baby.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fogleman/pyMeme/9336888a28399f6e96ef0d3c9cee077c082e3064/images/Drunk-Baby.jpg -------------------------------------------------------------------------------- /images/Dwight-Schrute.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fogleman/pyMeme/9336888a28399f6e96ef0d3c9cee077c082e3064/images/Dwight-Schrute.jpg -------------------------------------------------------------------------------- /images/Ermahgerd-Berks.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fogleman/pyMeme/9336888a28399f6e96ef0d3c9cee077c082e3064/images/Ermahgerd-Berks.jpg -------------------------------------------------------------------------------- /images/Evil-Cows.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fogleman/pyMeme/9336888a28399f6e96ef0d3c9cee077c082e3064/images/Evil-Cows.jpg -------------------------------------------------------------------------------- /images/Family-Tech-Support-Guy.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fogleman/pyMeme/9336888a28399f6e96ef0d3c9cee077c082e3064/images/Family-Tech-Support-Guy.jpg -------------------------------------------------------------------------------- /images/First-World-Problems-Cat.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fogleman/pyMeme/9336888a28399f6e96ef0d3c9cee077c082e3064/images/First-World-Problems-Cat.jpg -------------------------------------------------------------------------------- /images/First-World-Problems.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fogleman/pyMeme/9336888a28399f6e96ef0d3c9cee077c082e3064/images/First-World-Problems.jpg -------------------------------------------------------------------------------- /images/Fk-Yeah.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fogleman/pyMeme/9336888a28399f6e96ef0d3c9cee077c082e3064/images/Fk-Yeah.jpg -------------------------------------------------------------------------------- /images/Forever-Alone.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fogleman/pyMeme/9336888a28399f6e96ef0d3c9cee077c082e3064/images/Forever-Alone.jpg -------------------------------------------------------------------------------- /images/Foul-Bachelor-Frog.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fogleman/pyMeme/9336888a28399f6e96ef0d3c9cee077c082e3064/images/Foul-Bachelor-Frog.jpg -------------------------------------------------------------------------------- /images/Foul-Bachelorette-Frog.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fogleman/pyMeme/9336888a28399f6e96ef0d3c9cee077c082e3064/images/Foul-Bachelorette-Frog.jpg -------------------------------------------------------------------------------- /images/Futurama-Fry.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fogleman/pyMeme/9336888a28399f6e96ef0d3c9cee077c082e3064/images/Futurama-Fry.jpg -------------------------------------------------------------------------------- /images/Futurama-Zoidberg.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fogleman/pyMeme/9336888a28399f6e96ef0d3c9cee077c082e3064/images/Futurama-Zoidberg.jpg -------------------------------------------------------------------------------- /images/Gasp-Rage-Face.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fogleman/pyMeme/9336888a28399f6e96ef0d3c9cee077c082e3064/images/Gasp-Rage-Face.jpg -------------------------------------------------------------------------------- /images/Good-Guy-Greg.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fogleman/pyMeme/9336888a28399f6e96ef0d3c9cee077c082e3064/images/Good-Guy-Greg.jpg -------------------------------------------------------------------------------- /images/Grandma-Finds-The-Internet.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fogleman/pyMeme/9336888a28399f6e96ef0d3c9cee077c082e3064/images/Grandma-Finds-The-Internet.jpg -------------------------------------------------------------------------------- /images/Hawkward.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fogleman/pyMeme/9336888a28399f6e96ef0d3c9cee077c082e3064/images/Hawkward.jpg -------------------------------------------------------------------------------- /images/Helpful-Tyler-Durden.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fogleman/pyMeme/9336888a28399f6e96ef0d3c9cee077c082e3064/images/Helpful-Tyler-Durden.jpg -------------------------------------------------------------------------------- /images/High-Expectations-Asian-Father.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fogleman/pyMeme/9336888a28399f6e96ef0d3c9cee077c082e3064/images/High-Expectations-Asian-Father.jpg -------------------------------------------------------------------------------- /images/Hipster-Barista.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fogleman/pyMeme/9336888a28399f6e96ef0d3c9cee077c082e3064/images/Hipster-Barista.jpg -------------------------------------------------------------------------------- /images/Hipster-Kitty.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fogleman/pyMeme/9336888a28399f6e96ef0d3c9cee077c082e3064/images/Hipster-Kitty.jpg -------------------------------------------------------------------------------- /images/I-Have-No-Idea-What-I-Am-Doing.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fogleman/pyMeme/9336888a28399f6e96ef0d3c9cee077c082e3064/images/I-Have-No-Idea-What-I-Am-Doing.jpg -------------------------------------------------------------------------------- /images/Idiot-Nerd-Girl.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fogleman/pyMeme/9336888a28399f6e96ef0d3c9cee077c082e3064/images/Idiot-Nerd-Girl.jpg -------------------------------------------------------------------------------- /images/Ill-Just-Wait-Here.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fogleman/pyMeme/9336888a28399f6e96ef0d3c9cee077c082e3064/images/Ill-Just-Wait-Here.jpg -------------------------------------------------------------------------------- /images/Insanity-Wolf.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fogleman/pyMeme/9336888a28399f6e96ef0d3c9cee077c082e3064/images/Insanity-Wolf.jpg -------------------------------------------------------------------------------- /images/Joseph-Ducreux.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fogleman/pyMeme/9336888a28399f6e96ef0d3c9cee077c082e3064/images/Joseph-Ducreux.jpg -------------------------------------------------------------------------------- /images/Karate-Kyle.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fogleman/pyMeme/9336888a28399f6e96ef0d3c9cee077c082e3064/images/Karate-Kyle.jpg -------------------------------------------------------------------------------- /images/LOL-Guy.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fogleman/pyMeme/9336888a28399f6e96ef0d3c9cee077c082e3064/images/LOL-Guy.jpg -------------------------------------------------------------------------------- /images/Lame-Pun-Coon.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fogleman/pyMeme/9336888a28399f6e96ef0d3c9cee077c082e3064/images/Lame-Pun-Coon.jpg -------------------------------------------------------------------------------- /images/Lazy-College-Senior.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fogleman/pyMeme/9336888a28399f6e96ef0d3c9cee077c082e3064/images/Lazy-College-Senior.jpg -------------------------------------------------------------------------------- /images/Matrix-Morpheus.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fogleman/pyMeme/9336888a28399f6e96ef0d3c9cee077c082e3064/images/Matrix-Morpheus.jpg -------------------------------------------------------------------------------- /images/Men-Laughing.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fogleman/pyMeme/9336888a28399f6e96ef0d3c9cee077c082e3064/images/Men-Laughing.jpg -------------------------------------------------------------------------------- /images/Musically-Oblivious-8th-Grader.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fogleman/pyMeme/9336888a28399f6e96ef0d3c9cee077c082e3064/images/Musically-Oblivious-8th-Grader.jpg -------------------------------------------------------------------------------- /images/Neil-deGrasse-Tyson.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fogleman/pyMeme/9336888a28399f6e96ef0d3c9cee077c082e3064/images/Neil-deGrasse-Tyson.jpg -------------------------------------------------------------------------------- /images/Oh-No.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fogleman/pyMeme/9336888a28399f6e96ef0d3c9cee077c082e3064/images/Oh-No.jpg -------------------------------------------------------------------------------- /images/One-Does-Not-Simply.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fogleman/pyMeme/9336888a28399f6e96ef0d3c9cee077c082e3064/images/One-Does-Not-Simply.jpg -------------------------------------------------------------------------------- /images/Ordinary-Muslim-Man.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fogleman/pyMeme/9336888a28399f6e96ef0d3c9cee077c082e3064/images/Ordinary-Muslim-Man.jpg -------------------------------------------------------------------------------- /images/Original-I-Lied.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fogleman/pyMeme/9336888a28399f6e96ef0d3c9cee077c082e3064/images/Original-I-Lied.jpg -------------------------------------------------------------------------------- /images/Overly-Attached-Girlfriend.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fogleman/pyMeme/9336888a28399f6e96ef0d3c9cee077c082e3064/images/Overly-Attached-Girlfriend.jpg -------------------------------------------------------------------------------- /images/PTSD-Clarinet-Boy.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fogleman/pyMeme/9336888a28399f6e96ef0d3c9cee077c082e3064/images/PTSD-Clarinet-Boy.jpg -------------------------------------------------------------------------------- /images/Paranoid-Parrot.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fogleman/pyMeme/9336888a28399f6e96ef0d3c9cee077c082e3064/images/Paranoid-Parrot.jpg -------------------------------------------------------------------------------- /images/Patriotic-Eagle.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fogleman/pyMeme/9336888a28399f6e96ef0d3c9cee077c082e3064/images/Patriotic-Eagle.jpg -------------------------------------------------------------------------------- /images/Pedobear.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fogleman/pyMeme/9336888a28399f6e96ef0d3c9cee077c082e3064/images/Pedobear.jpg -------------------------------------------------------------------------------- /images/Philosoraptor.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fogleman/pyMeme/9336888a28399f6e96ef0d3c9cee077c082e3064/images/Philosoraptor.jpg -------------------------------------------------------------------------------- /images/Pickup-Line-Panda.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fogleman/pyMeme/9336888a28399f6e96ef0d3c9cee077c082e3064/images/Pickup-Line-Panda.jpg -------------------------------------------------------------------------------- /images/Priority-Peter.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fogleman/pyMeme/9336888a28399f6e96ef0d3c9cee077c082e3064/images/Priority-Peter.jpg -------------------------------------------------------------------------------- /images/Put-It-Somewhere-Else-Patrick.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fogleman/pyMeme/9336888a28399f6e96ef0d3c9cee077c082e3064/images/Put-It-Somewhere-Else-Patrick.jpg -------------------------------------------------------------------------------- /images/Question-Rage-Face.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fogleman/pyMeme/9336888a28399f6e96ef0d3c9cee077c082e3064/images/Question-Rage-Face.jpg -------------------------------------------------------------------------------- /images/Rasta-Science-Teacher.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fogleman/pyMeme/9336888a28399f6e96ef0d3c9cee077c082e3064/images/Rasta-Science-Teacher.jpg -------------------------------------------------------------------------------- /images/Redditors-Wife.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fogleman/pyMeme/9336888a28399f6e96ef0d3c9cee077c082e3064/images/Redditors-Wife.jpg -------------------------------------------------------------------------------- /images/Redneck-Randal.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fogleman/pyMeme/9336888a28399f6e96ef0d3c9cee077c082e3064/images/Redneck-Randal.jpg -------------------------------------------------------------------------------- /images/Rich-Raven.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fogleman/pyMeme/9336888a28399f6e96ef0d3c9cee077c082e3064/images/Rich-Raven.jpg -------------------------------------------------------------------------------- /images/Sad-X-All-The-Y.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fogleman/pyMeme/9336888a28399f6e96ef0d3c9cee077c082e3064/images/Sad-X-All-The-Y.jpg -------------------------------------------------------------------------------- /images/Say-That-Again-I-Dare-You.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fogleman/pyMeme/9336888a28399f6e96ef0d3c9cee077c082e3064/images/Say-That-Again-I-Dare-You.jpg -------------------------------------------------------------------------------- /images/Scumbag-Brain.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fogleman/pyMeme/9336888a28399f6e96ef0d3c9cee077c082e3064/images/Scumbag-Brain.jpg -------------------------------------------------------------------------------- /images/Scumbag-Minecraft.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fogleman/pyMeme/9336888a28399f6e96ef0d3c9cee077c082e3064/images/Scumbag-Minecraft.jpg -------------------------------------------------------------------------------- /images/Scumbag-Redditor.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fogleman/pyMeme/9336888a28399f6e96ef0d3c9cee077c082e3064/images/Scumbag-Redditor.jpg -------------------------------------------------------------------------------- /images/Scumbag-Steve.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fogleman/pyMeme/9336888a28399f6e96ef0d3c9cee077c082e3064/images/Scumbag-Steve.jpg -------------------------------------------------------------------------------- /images/Sexually-Oblivious-Rhino.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fogleman/pyMeme/9336888a28399f6e96ef0d3c9cee077c082e3064/images/Sexually-Oblivious-Rhino.jpg -------------------------------------------------------------------------------- /images/Sheltering-Suburban-Mom.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fogleman/pyMeme/9336888a28399f6e96ef0d3c9cee077c082e3064/images/Sheltering-Suburban-Mom.jpg -------------------------------------------------------------------------------- /images/Shut-Up-And-Take-My-Money-Fry.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fogleman/pyMeme/9336888a28399f6e96ef0d3c9cee077c082e3064/images/Shut-Up-And-Take-My-Money-Fry.jpg -------------------------------------------------------------------------------- /images/Skeptical-Baby.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fogleman/pyMeme/9336888a28399f6e96ef0d3c9cee077c082e3064/images/Skeptical-Baby.jpg -------------------------------------------------------------------------------- /images/Slowpoke.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fogleman/pyMeme/9336888a28399f6e96ef0d3c9cee077c082e3064/images/Slowpoke.jpg -------------------------------------------------------------------------------- /images/Socially-Awesome-Awkward-Penguin.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fogleman/pyMeme/9336888a28399f6e96ef0d3c9cee077c082e3064/images/Socially-Awesome-Awkward-Penguin.jpg -------------------------------------------------------------------------------- /images/Socially-Awesome-Penguin.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fogleman/pyMeme/9336888a28399f6e96ef0d3c9cee077c082e3064/images/Socially-Awesome-Penguin.jpg -------------------------------------------------------------------------------- /images/Socially-Awkward-Penguin.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fogleman/pyMeme/9336888a28399f6e96ef0d3c9cee077c082e3064/images/Socially-Awkward-Penguin.jpg -------------------------------------------------------------------------------- /images/Stoner-Dog.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fogleman/pyMeme/9336888a28399f6e96ef0d3c9cee077c082e3064/images/Stoner-Dog.jpg -------------------------------------------------------------------------------- /images/Success-Kid.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fogleman/pyMeme/9336888a28399f6e96ef0d3c9cee077c082e3064/images/Success-Kid.jpg -------------------------------------------------------------------------------- /images/Successful-Black-Man.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fogleman/pyMeme/9336888a28399f6e96ef0d3c9cee077c082e3064/images/Successful-Black-Man.jpg -------------------------------------------------------------------------------- /images/Sudden-Clarity-Clarence.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fogleman/pyMeme/9336888a28399f6e96ef0d3c9cee077c082e3064/images/Sudden-Clarity-Clarence.jpg -------------------------------------------------------------------------------- /images/Surprised-Coala.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fogleman/pyMeme/9336888a28399f6e96ef0d3c9cee077c082e3064/images/Surprised-Coala.jpg -------------------------------------------------------------------------------- /images/Tech-Impaired-Duck.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fogleman/pyMeme/9336888a28399f6e96ef0d3c9cee077c082e3064/images/Tech-Impaired-Duck.jpg -------------------------------------------------------------------------------- /images/The-Most-Interesting-Cat-In-The-World.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fogleman/pyMeme/9336888a28399f6e96ef0d3c9cee077c082e3064/images/The-Most-Interesting-Cat-In-The-World.jpg -------------------------------------------------------------------------------- /images/The-Most-Interesting-Man-In-The-World.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fogleman/pyMeme/9336888a28399f6e96ef0d3c9cee077c082e3064/images/The-Most-Interesting-Man-In-The-World.jpg -------------------------------------------------------------------------------- /images/Third-World-Skeptical-Kid.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fogleman/pyMeme/9336888a28399f6e96ef0d3c9cee077c082e3064/images/Third-World-Skeptical-Kid.jpg -------------------------------------------------------------------------------- /images/Third-World-Success-Kid.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fogleman/pyMeme/9336888a28399f6e96ef0d3c9cee077c082e3064/images/Third-World-Success-Kid.jpg -------------------------------------------------------------------------------- /images/Too-Damn-High.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fogleman/pyMeme/9336888a28399f6e96ef0d3c9cee077c082e3064/images/Too-Damn-High.jpg -------------------------------------------------------------------------------- /images/Troll-Face-Colored.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fogleman/pyMeme/9336888a28399f6e96ef0d3c9cee077c082e3064/images/Troll-Face-Colored.jpg -------------------------------------------------------------------------------- /images/True-Story.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fogleman/pyMeme/9336888a28399f6e96ef0d3c9cee077c082e3064/images/True-Story.jpg -------------------------------------------------------------------------------- /images/Unhelpful-High-School-Teacher.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fogleman/pyMeme/9336888a28399f6e96ef0d3c9cee077c082e3064/images/Unhelpful-High-School-Teacher.jpg -------------------------------------------------------------------------------- /images/Vengeance-Dad.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fogleman/pyMeme/9336888a28399f6e96ef0d3c9cee077c082e3064/images/Vengeance-Dad.jpg -------------------------------------------------------------------------------- /images/We-Will-Rebuild.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fogleman/pyMeme/9336888a28399f6e96ef0d3c9cee077c082e3064/images/We-Will-Rebuild.jpg -------------------------------------------------------------------------------- /images/X-All-The-Y.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fogleman/pyMeme/9336888a28399f6e96ef0d3c9cee077c082e3064/images/X-All-The-Y.jpg -------------------------------------------------------------------------------- /images/Y-U-No.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fogleman/pyMeme/9336888a28399f6e96ef0d3c9cee077c082e3064/images/Y-U-No.jpg -------------------------------------------------------------------------------- /images/Yao-Ming.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fogleman/pyMeme/9336888a28399f6e96ef0d3c9cee077c082e3064/images/Yao-Ming.jpg -------------------------------------------------------------------------------- /images/Yo-Dawg-Heard-You.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fogleman/pyMeme/9336888a28399f6e96ef0d3c9cee077c082e3064/images/Yo-Dawg-Heard-You.jpg -------------------------------------------------------------------------------- /installer.iss: -------------------------------------------------------------------------------- 1 | ; Script generated by the Inno Setup Script Wizard. 2 | ; SEE THE DOCUMENTATION FOR DETAILS ON CREATING INNO SETUP SCRIPT FILES! 3 | 4 | [Setup] 5 | ; NOTE: The value of AppId uniquely identifies this application. 6 | ; Do not use the same AppId value in installers for other applications. 7 | ; (To generate a new GUID, click Tools | Generate GUID inside the IDE.) 8 | AppId={{66CA7D93-1FDD-4152-B241-42971934D8E0} 9 | AppName=iMeme 10 | AppVerName=iMeme 1.0 11 | AppPublisher=Michael Fogleman 12 | AppPublisherURL=http://www.michaelfogleman.com/ 13 | AppSupportURL=http://www.michaelfogleman.com/imeme/ 14 | AppUpdatesURL=http://www.michaelfogleman.com/imeme/ 15 | DefaultDirName={pf}\iMeme 16 | DefaultGroupName=iMeme 17 | AllowNoIcons=yes 18 | OutputDir=installer 19 | OutputBaseFilename=iMeme-setup 20 | Compression=lzma 21 | SolidCompression=yes 22 | 23 | [Languages] 24 | Name: "english"; MessagesFile: "compiler:Default.isl" 25 | 26 | [Tasks] 27 | Name: "desktopicon"; Description: "{cm:CreateDesktopIcon}"; GroupDescription: "{cm:AdditionalIcons}"; Flags: unchecked 28 | Name: "quicklaunchicon"; Description: "{cm:CreateQuickLaunchIcon}"; GroupDescription: "{cm:AdditionalIcons}"; Flags: unchecked 29 | 30 | [Dirs] 31 | Name: "{app}"; Permissions: everyone-modify 32 | 33 | [Files] 34 | Source: "dist\iMeme.exe"; DestDir: "{app}"; Flags: ignoreversion; Permissions: everyone-readexec 35 | Source: "dist\w9xpopen.exe"; DestDir: "{app}"; Flags: ignoreversion; Permissions: everyone-readexec 36 | ;Source: "dist\library.zip"; DestDir: "{app}"; Flags: ignoreversion; Permissions: everyone-readexec 37 | Source: "dist\*"; DestDir: "{app}"; Flags: ignoreversion recursesubdirs createallsubdirs 38 | ; NOTE: Don't use "Flags: ignoreversion" on any shared system files 39 | 40 | [Icons] 41 | Name: "{group}\iMeme"; Filename: "{app}\iMeme.exe"; WorkingDir: "{app}"; 42 | Name: "{group}\{cm:UninstallProgram,iMeme}"; Filename: "{uninstallexe}" 43 | Name: "{userdesktop}\iMeme"; Filename: "{app}\iMeme.exe"; WorkingDir: "{app}"; Tasks: desktopicon 44 | Name: "{userappdata}\Microsoft\Internet Explorer\Quick Launch\iMeme"; Filename: "{app}\iMeme.exe"; WorkingDir: "{app}"; Tasks: quicklaunchicon 45 | 46 | [Run] 47 | Filename: "{app}\iMeme.exe"; Description: "{cm:LaunchProgram,iMeme}"; Flags: nowait postinstall 48 | 49 | -------------------------------------------------------------------------------- /main.py: -------------------------------------------------------------------------------- 1 | import cache 2 | import core 3 | import os 4 | import wx 5 | import platform 6 | import subprocess 7 | import urllib2 8 | 9 | IMAGES_PATH = os.path.abspath('images') 10 | 11 | def show_folder(path): 12 | system = platform.system().lower() 13 | if system == 'darwin': 14 | try: 15 | from appscript import App, mactypes 16 | if os.path.exists(path): 17 | App("Finder").reveal(mactypes.Alias(path).alias) 18 | except: 19 | subprocess.call(['open', '-R', path]) 20 | elif system == 'windows': 21 | if os.path.exists(IMAGES_PATH): 22 | subprocess.call(['start', path], shell=True) 23 | elif system == 'linux': 24 | print 'Linux not implemented yet.' 25 | 26 | def menu_item(window, menu, label, func): 27 | item = wx.MenuItem(menu, -1, label) 28 | menu.AppendItem(item) 29 | if func: 30 | window.Bind(wx.EVT_MENU, func, id=item.GetId()) 31 | return item 32 | 33 | def tool_item(window, toolbar, label, func, icon): 34 | item = toolbar.AddSimpleTool(-1, wx.Bitmap(icon), label) 35 | if func: 36 | window.Bind(wx.EVT_TOOL, func, id=item.GetId()) 37 | return item 38 | 39 | def load_images(): 40 | result = [] 41 | names = os.listdir(IMAGES_PATH) 42 | for name in names: 43 | base, ext = os.path.splitext(name) 44 | if ext in ('.png', '.jpg', '.jpeg'): 45 | title = base.replace('-', ' ') 46 | title = title.replace('_', ' ') 47 | full_path = os.path.join(IMAGES_PATH, name) 48 | result.append((title, full_path)) 49 | return result 50 | 51 | class ImageDropTarget(wx.PyDropTarget): 52 | def __init__(self, callback): 53 | super(ImageDropTarget, self).__init__() 54 | self.callback = callback 55 | self.do = wx.DataObjectComposite() 56 | self.file_do = wx.FileDataObject() 57 | self.url_do = wx.TextDataObject() 58 | self.do.Add(self.file_do) 59 | self.do.Add(self.url_do) 60 | self.SetDataObject(self.do) 61 | 62 | def OnData(self, x, y, data): 63 | if self.GetData(): 64 | df = self.do.GetReceivedFormat().GetType() 65 | if df in [wx.DF_UNICODETEXT, wx.DF_TEXT]: 66 | try: 67 | self.callback(self.url_do.GetText()) 68 | except: 69 | pass 70 | elif df == wx.DF_FILENAME: 71 | try: 72 | self.callback(self.file_do.GetFilenames()[0]) 73 | except: 74 | pass 75 | 76 | class Model(object): 77 | def __init__(self): 78 | self.path = '' 79 | self.reset() 80 | def reset(self): 81 | self.header = '' 82 | self.footer = '' 83 | self.header_size = 20 84 | self.footer_size = 20 85 | self.header_alignment = core.CENTER 86 | self.footer_alignment = core.CENTER 87 | self.padding = 10 88 | self.border_size = 3 89 | def generate(self): 90 | background = cache.get_bitmap(self.path) 91 | width, height = background.GetSize() 92 | page = core.Page() 93 | page.add(core.Bitmap(background)) 94 | text_width = width - self.padding * 2 95 | adjusted_header_size = int(height*(self.header_size/200.0)) 96 | adjusted_footer_size = int(height*(self.footer_size/200.0)) 97 | header = core.Text( 98 | self.header.upper(), 99 | text_width, 100 | alignment=self.header_alignment, 101 | border_color=(0, 0, 0), 102 | border_size=self.border_size, 103 | color=(255, 255, 255), 104 | font=core.font('Impact', adjusted_header_size), 105 | ) 106 | page.add(header, (width / 2, self.padding), (0.5, 0)) 107 | footer = core.Text( 108 | self.footer.upper(), 109 | text_width, 110 | alignment=self.footer_alignment, 111 | border_color=(0, 0, 0), 112 | border_size=self.border_size, 113 | color=(255, 255, 255), 114 | font=core.font('Impact', adjusted_footer_size), 115 | ) 116 | page.add(footer, (width / 2, -self.padding), (0.5, 1)) 117 | bitmap = wx.EmptyBitmap(width, height) 118 | dc = wx.MemoryDC(bitmap) 119 | page.render(dc, (width, height), (0, 0)) 120 | return bitmap 121 | 122 | class BitmapView(wx.Panel): 123 | def __init__(self, parent): 124 | super(BitmapView, self).__init__(parent, style=wx.BORDER_STATIC) 125 | self.bitmap = None 126 | self.scaled_bitmap = None 127 | self.SetBackgroundStyle(wx.BG_STYLE_CUSTOM) 128 | self.Bind(wx.EVT_PAINT, self.on_paint) 129 | self.Bind(wx.EVT_SIZE, self.on_size) 130 | def set_bitmap(self, bitmap): 131 | self.bitmap = bitmap 132 | self.Refresh() 133 | def on_size(self, event): 134 | event.Skip() 135 | self.Refresh() 136 | def on_paint(self, event): 137 | color = wx.SystemSettings_GetColour(wx.SYS_COLOUR_BTNFACE) 138 | dc = wx.BufferedPaintDC(self) 139 | dc.SetBackground(wx.Brush(color)) 140 | dc.Clear() 141 | dc = wx.GCDC(dc) 142 | if self.bitmap is None: 143 | return 144 | pad = 0 145 | cw, ch = self.GetClientSize() 146 | dw, dh = cw - pad * 2, ch - pad * 2 147 | bw, bh = self.bitmap.GetSize() 148 | xr, yr = float(dw) / float(bw), float(dh) / float(bh) 149 | ratio = min(xr, yr) 150 | ratio = min(ratio, 1) 151 | sw, sh = int(cw / ratio), int(ch / ratio) 152 | x, y = (sw - bw) / 2, (sh - bh) / 2 153 | dc.SetUserScale(ratio, ratio) 154 | dc.DrawBitmap(self.bitmap, x, y) 155 | 156 | class Frame(wx.Frame): 157 | def __init__(self): 158 | super(Frame, self).__init__(None, -1, 'iMeme') 159 | self.SetIcon(wx.Icon('icons/icon.ico', wx.BITMAP_TYPE_ICO)) 160 | self.model = Model() 161 | self.create_menu() 162 | self.create_toolbar() 163 | panel = self.create_contents(self) 164 | sizer = wx.BoxSizer(wx.VERTICAL) 165 | sizer.Add(panel, 1, wx.EXPAND) 166 | self.SetSizerAndFit(sizer) 167 | self.on_change() 168 | def on_change(self): 169 | self.bitmap_view.set_bitmap(self.model.generate()) 170 | def on_files_dropped(self, data): 171 | if data: 172 | self.model.path = data 173 | self.on_change() 174 | 175 | def create_contents(self, parent): 176 | panel = wx.Panel(parent) 177 | controls = self.create_controls(panel) 178 | sizer = wx.BoxSizer(wx.VERTICAL) 179 | sizer.Add(controls, 1, wx.EXPAND | wx.ALL, 12) 180 | panel.SetSizerAndFit(sizer) 181 | return panel 182 | def create_controls(self, parent): 183 | list_box = self.create_list_box(parent) 184 | right = self.create_right(parent) 185 | sizer = wx.BoxSizer(wx.HORIZONTAL) 186 | sizer.Add(list_box, 0, wx.EXPAND) 187 | sizer.AddSpacer(8) 188 | sizer.Add(right, 1, wx.EXPAND) 189 | return sizer 190 | def create_list_box(self, parent): 191 | self.list_box = wx.ListBox(parent, size=(200, -1)) 192 | self.list_box.Bind(wx.EVT_LISTBOX, self.on_list_box) 193 | data = load_images() 194 | for title, path in data: 195 | self.list_box.Append(title, path) 196 | self.model.path = data[0][1] 197 | self.list_box.Select(0) 198 | return self.list_box 199 | def create_right(self, parent): 200 | view = self.create_view(parent) 201 | widgets = self.create_widgets(parent) 202 | sizer = wx.BoxSizer(wx.VERTICAL) 203 | sizer.Add(view, 1, wx.EXPAND) 204 | sizer.AddSpacer(8) 205 | sizer.Add(widgets, 0, wx.EXPAND) 206 | return sizer 207 | def create_view(self, parent): 208 | self.bitmap_view = BitmapView(parent) 209 | self.bitmap_view.SetMinSize((400, 400)) 210 | self.bitmap_view.SetDropTarget(ImageDropTarget(self.on_files_dropped)) 211 | return self.bitmap_view 212 | def create_widgets(self, parent): 213 | self.header = header = wx.TextCtrl(parent) 214 | self.footer = footer = wx.TextCtrl(parent) 215 | header_smaller = wx.BitmapButton(parent, -1, wx.Bitmap('icons/minus.png')) 216 | header_bigger = wx.BitmapButton(parent, -1, wx.Bitmap('icons/plus.png')) 217 | header_left = wx.BitmapButton(parent, -1, wx.Bitmap('icons/align-left.png')) 218 | header_center = wx.BitmapButton(parent, -1, wx.Bitmap('icons/align-center.png')) 219 | header_right = wx.BitmapButton(parent, -1, wx.Bitmap('icons/align-right.png')) 220 | footer_smaller = wx.BitmapButton(parent, -1, wx.Bitmap('icons/minus.png')) 221 | footer_bigger = wx.BitmapButton(parent, -1, wx.Bitmap('icons/plus.png')) 222 | footer_left = wx.BitmapButton(parent, -1, wx.Bitmap('icons/align-left.png')) 223 | footer_center = wx.BitmapButton(parent, -1, wx.Bitmap('icons/align-center.png')) 224 | footer_right = wx.BitmapButton(parent, -1, wx.Bitmap('icons/align-right.png')) 225 | header.Bind(wx.EVT_TEXT, self.on_header) 226 | header_smaller.Bind(wx.EVT_BUTTON, self.on_header_smaller) 227 | header_bigger.Bind(wx.EVT_BUTTON, self.on_header_bigger) 228 | header_left.Bind(wx.EVT_BUTTON, self.on_header_left) 229 | header_center.Bind(wx.EVT_BUTTON, self.on_header_center) 230 | header_right.Bind(wx.EVT_BUTTON, self.on_header_right) 231 | footer.Bind(wx.EVT_TEXT, self.on_footer) 232 | footer_smaller.Bind(wx.EVT_BUTTON, self.on_footer_smaller) 233 | footer_bigger.Bind(wx.EVT_BUTTON, self.on_footer_bigger) 234 | footer_left.Bind(wx.EVT_BUTTON, self.on_footer_left) 235 | footer_center.Bind(wx.EVT_BUTTON, self.on_footer_center) 236 | footer_right.Bind(wx.EVT_BUTTON, self.on_footer_right) 237 | grid = wx.FlexGridSizer(2, 8, 8, 0) 238 | grid.AddGrowableCol(0) 239 | grid.Add(header, flag=wx.EXPAND) 240 | grid.AddSpacer(8) 241 | grid.Add(header_smaller) 242 | grid.Add(header_bigger) 243 | grid.AddSpacer(8) 244 | grid.Add(header_left) 245 | grid.Add(header_center) 246 | grid.Add(header_right) 247 | grid.Add(footer, flag=wx.EXPAND) 248 | grid.AddSpacer(8) 249 | grid.Add(footer_smaller) 250 | grid.Add(footer_bigger) 251 | grid.AddSpacer(8) 252 | grid.Add(footer_left) 253 | grid.Add(footer_center) 254 | grid.Add(footer_right) 255 | return grid 256 | def create_menu(self): 257 | menubar = wx.MenuBar() 258 | # File 259 | menu = wx.Menu() 260 | menu_item(self, menu, 'New\tCtrl+N', self.on_new) 261 | menu_item(self, menu, 'Open...\tCtrl+O', self.on_open) 262 | menu_item(self, menu, 'Save As...\tCtrl+S', self.on_save) 263 | menu.AppendSeparator() 264 | menu_item(self, menu, 'Show Images Folder', self.on_show_images) 265 | menu.AppendSeparator() 266 | menu_item(self, menu, 'Exit\tAlt+F4', self.on_exit) 267 | menubar.Append(menu, '&File') 268 | self.SetMenuBar(menubar) 269 | def create_toolbar(self): 270 | toolbar = self.CreateToolBar() 271 | toolbar.SetToolBitmapSize((18, 18)) 272 | tool_item(self, toolbar, 'New', self.on_new, 'icons/new.png') 273 | tool_item(self, toolbar, 'Open', self.on_open, 'icons/open.png') 274 | tool_item(self, toolbar, 'Save', self.on_save, 'icons/save.png') 275 | toolbar.Realize() 276 | toolbar.Fit() 277 | self.SetToolBar(toolbar) 278 | def on_list_box(self, event): 279 | index = self.list_box.GetSelection() 280 | if index >= 0: 281 | self.model.path = self.list_box.GetClientData(index) 282 | self.on_change() 283 | def on_header(self, event): 284 | self.model.header = self.header.GetValue() 285 | self.on_change() 286 | def on_header_smaller(self, event): 287 | if self.model.header_size <= 10: 288 | self.model.header_size -= 1 289 | else: 290 | self.model.header_size -= 4 291 | self.model.header_size = max(self.model.header_size, 1) 292 | self.on_change() 293 | def on_header_bigger(self, event): 294 | if self.model.header_size <= 10: 295 | self.model.header_size += 1 296 | else: 297 | self.model.header_size += 4 298 | self.model.header_size = min(self.model.header_size, 100) 299 | self.on_change() 300 | def on_header_left(self, event): 301 | self.model.header_alignment = core.LEFT 302 | self.on_change() 303 | def on_header_center(self, event): 304 | self.model.header_alignment = core.CENTER 305 | self.on_change() 306 | def on_header_right(self, event): 307 | self.model.header_alignment = core.RIGHT 308 | self.on_change() 309 | def on_footer(self, event): 310 | self.model.footer = self.footer.GetValue() 311 | self.on_change() 312 | def on_footer_smaller(self, event): 313 | if self.model.footer_size <= 10: 314 | self.model.footer_size -= 1 315 | else: 316 | self.model.footer_size -= 4 317 | self.model.footer_size = max(self.model.footer_size, 1) 318 | self.on_change() 319 | def on_footer_bigger(self, event): 320 | if self.model.footer_size <= 10: 321 | self.model.footer_size += 1 322 | else: 323 | self.model.footer_size += 4 324 | self.model.footer_size = min(self.model.footer_size, 100) 325 | self.on_change() 326 | def on_footer_left(self, event): 327 | self.model.footer_alignment = core.LEFT 328 | self.on_change() 329 | def on_footer_center(self, event): 330 | self.model.footer_alignment = core.CENTER 331 | self.on_change() 332 | def on_footer_right(self, event): 333 | self.model.footer_alignment = core.RIGHT 334 | self.on_change() 335 | def on_new(self, event): 336 | self.model.reset() 337 | self.header.SetValue('') 338 | self.footer.SetValue('') 339 | self.on_change() 340 | def on_open(self, event): 341 | exts = sorted(['*.png', '*.jpg', '*.jpeg', '*.gif', '*.bmp']) 342 | wildcard = ';'.join(exts) 343 | dialog = wx.FileDialog(self, 'Open', wildcard=wildcard, 344 | style=wx.FD_OPEN|wx.FD_FILE_MUST_EXIST) 345 | if dialog.ShowModal() == wx.ID_OK: 346 | path = dialog.GetPath() 347 | self.model.path = path 348 | self.on_change() 349 | def on_save(self, event): 350 | dialog = wx.FileDialog(self, 'Save As', wildcard='*.jpg', 351 | style=wx.FD_SAVE|wx.FD_OVERWRITE_PROMPT) 352 | if dialog.ShowModal() == wx.ID_OK: 353 | path = dialog.GetPath() 354 | bitmap = self.model.generate() 355 | image = wx.ImageFromBitmap(bitmap) 356 | image.SetOptionInt(wx.IMAGE_OPTION_QUALITY, 95) 357 | image.SaveFile(path, wx.BITMAP_TYPE_JPEG) 358 | def on_show_images(self, event): 359 | show_folder(IMAGES_PATH) 360 | def on_exit(self, event): 361 | self.Close() 362 | 363 | def main(): 364 | app = wx.PySimpleApp() 365 | frame = Frame() 366 | frame.Center() 367 | frame.Show() 368 | app.MainLoop() 369 | 370 | if __name__ == '__main__': 371 | main() 372 | -------------------------------------------------------------------------------- /setup.py: -------------------------------------------------------------------------------- 1 | import distutils 2 | import os 3 | import py2exe 4 | import shutil 5 | import sys 6 | 7 | def run_py2exe(): 8 | py2exe.__version__ 9 | sys.argv.append('py2exe') 10 | distutils.core.setup( 11 | options = {"py2exe":{ 12 | "compressed": True, 13 | "optimize": 2, 14 | "bundle_files": 1, 15 | "excludes": ['Tkconstants', 'Tkinter', 'tcl'], 16 | "dll_excludes": ['msvcp90.dll'], 17 | }}, 18 | windows = [{ 19 | "script": "main.py", 20 | "dest_base": "iMeme", 21 | "icon_resources": [(1, "icons/icon.ico")], 22 | "other_resources": [(24, 1, MANIFEST)], 23 | }], 24 | zipfile=None, 25 | ) 26 | 27 | def copy_file(src): 28 | print 'Copying:', src 29 | dst = os.path.join('dist', src) 30 | try: 31 | os.makedirs(os.path.split(dst)[0]) 32 | except Exception: 33 | pass 34 | shutil.copyfile(src, dst) 35 | 36 | def copy_directory(src): 37 | for path, _, files in os.walk(src): 38 | if '.svn' in path: 39 | continue 40 | for filename in files: 41 | copy_file(os.path.join(path, filename)) 42 | 43 | def main(): 44 | run_py2exe() 45 | copy_directory('icons') 46 | copy_directory('images') 47 | copy_directory('Microsoft.VC90.CRT') 48 | 49 | MANIFEST = ''' 50 | 52 | 58 | Star Rocket Level Editor 1.0 59 | 60 | 61 | 62 | 66 | 67 | 68 | 69 | 70 | 71 | 78 | 79 | 80 | 81 | 82 | 90 | 91 | 92 | 93 | ''' 94 | 95 | if __name__ == '__main__': 96 | main() 97 | --------------------------------------------------------------------------------