はじめに
先日ゲーム制作中に、smoothscale
というものを使ったのですが、何気にこれってめちゃくちゃ大事じゃね?と気づきました。そこで、初心者や、pygame
を普段使わない人向けに、簡単な紹介をしようと思います。
smoothscaleとは
smoothscale
は通常のscale
と同様に、画像を拡大、縮小するためのメソッドです。以下のように使うことができます。Surface
が画像のことです。
scaled_surface = pygame.transform.smoothscale(Surface, (width, height))
これを見て気づいた方も多いと思いますが、pygame.transform.scale
とは、使い方も手間も一緒です。つまり、普段使っているscale
の前にsmooth
という6文字を入れるだけで、拡大、縮小後の画像が、ワンランク上の仕上がりになります。
記事の冒頭にも載せてありますが、実際に画像を拡大し比較したものです。
scale
を使った画像の方は、なんだか画質が悪いような感じがしませんか?あるいは、それに見慣れている人は、smoothscale
を使った画像の画質が特別良いと感じるでしょうか。いずれにせよ、smoothscale
を使った方が、きれいな仕上がりになっているということが、お分かりいただけると思います。
付け焼き刃の知識ですが、一応説明っぽいものを置いておきます。scale
を使って普通に拡大、縮小を行うと、ジャギーというギザギザが生じてしまうので、仕上がりが少し残念になります。一方、smoothscale
を使うと、拡大縮小だけでなく、名前の通り滑らかにしてくれます。これにより、ジャギーが気にならない、きれいな仕上がりになるというわけです。この点から、smoothscale
の方は計算コストが高いという点をデメリットとして挙げられます。しかし、個人でゲームを作っている分には全く気にならない程度なので、基本的にはsmoothscale
を使う方針で問題ないと考えています。
あまりに大量の画像を読み込む場合や、ゲームループ内で繰り返し画像を読み込む場合には、パフォーマンスに影響することがあるかもしれません。もしパフォーマンスに影響が生じたときは、優先度の低い画像からscale
に置き換えていくのが良いでしょう。
使い方の補足
他にはdest_surface
という引数があります。これを指定することで、新しく生成するのではなく、指定したSurface
に上書きする形で生成できます。しかし、指定する先のSurface
のサイズと形式を合わせる必要があるので、以下のように手順が多くなります。
width = 128
height = 128
source_surface = pygame.image.load('test.png')
scaled_surface = pygame.Surface((width, height)).convert(source_surface)
pygame.transform.smoothscale(Surface, (width, height), dest_surface = scaled_surface)
サイズを合わせないといけないので、元の画像を破壊的に変更するような使い方はできなそうです。
画像の拡大縮小を多用するときは、こちらの方法を使った方が、効率が良いと説明が載っていたので、場合によっては使ってみるといいかもしれません。
まとめ
特に理由がなければ、scale
よりもsmoothscale
を使ったほうがゲームの見た目が良くなる!今すぐ置き換えよう!
最後に
ここまで読んで下さりありがとうございました。smoothscale
はだいぶ前から使ったことがあったのですが、そこまで大きく拡大や縮小をしていなかったので、今まで真価に気づいていませんでした。ゲームって見栄えで印象が全然変わってくると思うので、pygameでゲームを作る際には、必須の知識だと思います。ぜひ皆さんもお試しください。
また、他にも拡大縮小のメソッド自体がいくつかあるので、場面ごとに最善を求める方は、参考に貼ってあるページを覗いてみると良いかもしれません。(そのようなレベルの方は既に見ているでしょうし、筆者より知識もあると思いますが)
参考
日本語訳
原文