XPERIA用の壁紙を自動生成

今更docomo用のスマートフォンXPERIAを購入(ヤマダ電気で, モロモロの値引きを使用して, 3万円弱でした)。

とりあえず、壁紙を作ってみました。

XPERIA用壁紙の仕様
  • 960ピクセル×854ピクセル(結構大きい)
  • ステータスバーで上部30ピクセルが隠れる
  • アプリケーションバーで下部50ピクセルが隠れる
実際には仮想デスクトップが5枚あるので、一度に見えるのは全体の一部だけ

したがって、一枚絵というか、キャラクターがバーンと中央にいるイラストなどは、切れてしまいます。幾何学模様的な絵の方が良さそうです。

BMPやPNGも、JPEGに変換されてから使われる?

JPEGでは、単色で塗りつぶした四角形などは、圧縮時にディザがかかるので、綺麗に見えません。
グラデーションがある曲線中心のデザインを使いましょう。


Pythonで、PySideを使って、自動生成してみます。
どこかでみたような、ソコソコよさげな壁紙が出来ました。

#encoding: shift-jis
#spheres-wallpaper.py
from __future__ import division, print_function, unicode_literals
from PySide.QtGui import *
from PySide.QtCore import *
import random
from colorsys import *

def lighter(color):
    r, g, b = color.red()/255, color.green()/255, color.blue()/255
    h, s, v = rgb_to_hsv(r, g, b)
    v *= 1.3
    r, g, b = hsv_to_rgb(h, s, v)
    
    return QColor(
        min(int(r*255), 255),
        min(int(g*255), 255),
        min(int(b*255), 255),
    )


def drawSphere(painter, pos, radius, color):
    Delta = 2
    pen = painter.pen()
    pen.setColor(color)
    pen.setWidth(Delta + 1)
    painter.setPen(pen)
    
    rc = QRect(pos - QPoint(radius, radius), QSize(2*radius, 2*radius))
    for i in xrange(10):
        rc = rc.translated(Delta, Delta)
        rc.setSize(rc.size() - QSize(Delta*2, Delta*2))
        painter.drawArc(rc, 0, 360*16)
        
        pen.setColor(lighter(pen.color()))
        painter.setPen(pen)
        

def main():
    app = QApplication([])
    width = 960
    height = 854
    im = QImage(width, height, QImage.Format_ARGB32)
    painter = QPainter(im)
    painter.setRenderHint(QPainter.Antialiasing)
    painter.setBackground(QColor("white"))
    painter.eraseRect(im.rect())
    
    spheres = []
    for i in xrange(1000):
        r = random.uniform(10, 70)
        p = QPoint(random.randrange(width),
                   random.randrange(height))
        
        if all((p.x() - p1.x())**2 + (p.y() - p1.y())**2 > (r + r1)**2 for p1, r1 in spheres):
            spheres.append((p, r))
    
    for i, (pos, radius) in enumerate(spheres):
        h = random.uniform(0, 1)
        s = .6
        v = .8
        color = QColor(*[int(i *255) for i in hsv_to_rgb(h, s, v)])
        drawSphere(painter, pos, radius, color)
    
    im.save("spheres.png")
    del painter
    
if "__main__" == __name__:
    main()