diff --git a/generate_emoji_thumbnails.py b/generate_emoji_thumbnails.py
index 4d292456f..e67da5339 100755
--- a/generate_emoji_thumbnails.py
+++ b/generate_emoji_thumbnails.py
@@ -36,12 +36,19 @@ from nototools import unicode_data
 
 logger = logging.getLogger('emoji_thumbnails')
 
-def create_thumbnail(src_path, dst_path):
-  # uses imagemagik
-  # we need images exactly 72x72 in size, with transparent background
-  subprocess.check_call([
-      'convert', '-thumbnail', '72x72', '-gravity', 'center', '-background',
-      'none', '-extent', '72x72', src_path, 'PNG32:' + dst_path])
+def create_thumbnail(src_path, dst_path, crop):
+  # Uses imagemagik
+  # We need images exactly 72x72 in size, with transparent background.
+  # Remove 4-pixel LR margins from 136x128 source images if we crop.
+  if crop:
+    cmd = [
+        'convert', src_path, '-crop', '128x128+4+0!', '-thumbnail', '72x72',
+        'PNG32:' + dst_path]
+  else:
+    cmd = [
+        'convert', '-thumbnail', '72x72', '-gravity', 'center', '-background',
+        'none', '-extent', '72x72', src_path, 'PNG32:' + dst_path]
+  subprocess.check_call(cmd)
 
 
 def get_inv_aliases():
@@ -77,14 +84,16 @@ def sequence_to_filename(seq, prefix, suffix):
   return ''.join((prefix, unicode_data.seq_to_string(seq), suffix))
 
 
-def create_thumbnails_and_aliases(src_dir, dst_dir, dst_prefix):
+def create_thumbnails_and_aliases(src_dir, dst_dir, crop, dst_prefix):
   """Creates thumbnails in dst_dir based on sources in src.dir, using
   dst_prefix. Assumes the source prefix is 'emoji_u' and the common suffix
   is '.png'."""
 
+  src_dir = tool_utils.resolve_path(src_dir)
   if not path.isdir(src_dir):
     raise ValueError('"%s" is not a directory')
-  dst_dir = tool_utils.ensure_dir_exists(dst_dir)
+
+  dst_dir = tool_utils.ensure_dir_exists(tool_utils.resolve_path(dst_dir))
 
   src_prefix = 'emoji_u'
   suffix = '.png'
@@ -104,8 +113,9 @@ def create_thumbnails_and_aliases(src_dir, dst_dir, dst_prefix):
     dst_file = sequence_to_filename(seq, dst_prefix, suffix)
     dst_path = path.join(dst_dir, dst_file)
 
-    create_thumbnail(src_path, dst_path)
-    logger.info('wrote thumbnail: %s' % dst_file)
+    create_thumbnail(src_path, dst_path, crop)
+    logger.info('wrote thumbnail%s: %s' % (
+        ' with crop' if crop else '', dst_file))
 
     for alias_seq in inv_aliases.get(seq, ()):
       alias_file = sequence_to_filename(alias_seq, dst_prefix, suffix)
@@ -115,15 +125,22 @@ def create_thumbnails_and_aliases(src_dir, dst_dir, dst_prefix):
 
 
 def main():
+  SRC_DEFAULT = '[emoji]/build/compressed_pngs'
+  PREFIX_DEFAULT = 'android_'
+
   parser = argparse.ArgumentParser()
   parser.add_argument(
-      '-s', '--src_dir', help='source images', metavar='dir', required=True)
+      '-s', '--src_dir', help='source images (default \'%s\')' % SRC_DEFAULT,
+      default=SRC_DEFAULT, metavar='dir')
   parser.add_argument(
       '-d', '--dst_dir', help='destination directory', metavar='dir',
       required=True)
   parser.add_argument(
-      '-p', '--prefix', help='prefix for thumbnail', metavar='str',
-      default='android_')
+      '-p', '--prefix', help='prefix for thumbnail (default \'%s\')' %
+      PREFIX_DEFAULT, default=PREFIX_DEFAULT, metavar='str')
+  parser.add_argument(
+      '-c', '--crop', help='crop images (will automatically crop if '
+      'src dir is the default)', action='store_true')
   parser.add_argument(
       '-v', '--verbose', help='write log output', metavar='level',
       choices='warning info debug'.split(), const='info',
@@ -133,8 +150,9 @@ def main():
   if args.verbose is not None:
     logging.basicConfig(level=getattr(logging, args.verbose.upper()))
 
+  crop = args.crop or (args.src_dir == SRC_DEFAULT)
   create_thumbnails_and_aliases(
-      args.src_dir, args.dst_dir, args.prefix)
+      args.src_dir, args.dst_dir, crop, args.prefix)
 
 
 if __name__ == '__main__':