我怎样才能用kivy / python缩小图像效果?

时间:2016-06-21 21:34:20

标签: python image kivy resolution downsampling

我试图以比它们的来源更小的尺寸显示图像,而我已经实现了这一点,除了1080p以外的任何分辨率,质量都很糟糕。到目前为止,这是我的代码:

import random
from kivy.app import App
from kivy.uix.widget import Widget
from kivy.core.window import Window
from kivy.uix.image import Image
from kivy.logger import Logger
from kivy.metrics import Metrics
from kivy.graphics import Color, Rectangle
from kivy.uix.scatter import Scatter

Window.fullscreen = True
Window.size = (1920, 1080)

Player1Hand=['Spade', 'Spade', 'Spade',
                        'Heart', 'Heart',
                        'Heart', 'Diamond', 'Club',
                        'Club', 'Club']

random.shuffle(Player1Hand)
global Draw_Card
Draw_Card = 0

class Sprite(Image):

    def __init__(self, **kwargs):
        super(Sprite, self).__init__(allow_stretch=True, **kwargs)
        self.texture.mag_filter = 'linear'
        w, h = self.texture_size
        self.size = (params.scale * w, params.scale * h)

class CardSprite(Image):

    def __init__(self, **kwargs):
        super(CardSprite, self).__init__(allow_stretch=True, **kwargs)
        self.texture.mag_filter = 'linear'
        w = 210.9
        h = 240
        self.size = (params.scale * w, params.scale * h)


class PlayerHandArea(Widget):


    def __init__(self):
        super(PlayerHandArea, self).__init__()
        with self.canvas:
            Color(1,0,0,0.5)
            Rectangle(size=((1152 * params.scale), (240 * params.scale)),
                      pos = ((384 * params.scale), 0))

class DrawCard(Widget):

    def __init__(self):
        super(DrawCard, self).__init__()
        global Draw_Card
        while Draw_Card > 0:
            scatter = Scatter(do_rotation=False, do_scale=False,
                              size_hint=(None,None),
                              size=(210.9 * params.scale, 240 * params.scale))
            self.NextCard = (CardSprite
                (source='Images/'+(Player1Hand.pop(0))+'.png'))
            self.add_widget(scatter)
            scatter.add_widget(self.NextCard)
            Draw_Card += -1           

class Blank(Widget):

    def __init__(self, pos, size):
        super(Blank, self).__init__()
        with self.canvas:
            Color(0, 0, 0)
            Rectangle(pos=pos, size=size)
            Color(1, 1, 1)

class Game(Widget):

    def __init__(self):
        super(Game, self).__init__()
        self.background = (Sprite
                (source='Images/Background.jpg'))
        self.size = self.background.size
        self.add_widget(self.background)
        self.add_widget(PlayerHandArea())
        global Draw_Card
        Draw_Card += 5
        self.add_widget(DrawCard())
        self.add_widget(Blank(*params.blank_rect))

class GameApp(App):

    def build(self):
        params.init()
        top = Widget()
        top.add_widget(Game())
        return top

class params(object):

    def init(self):
        self.bg_width, self.bg_height = 1920, 1080
        self.width, self.height = Window.size
        self.center = Window.center
        ws = float(self.width) / self.bg_width
        hs = float(self.height) / self.bg_height
        self.scale = min(ws, hs)
        Logger.info('size=%r; dpi=%r; density=%r; SCALE=%r',
            Window.size, Metrics.dpi, Metrics.density, self.scale)
        if ws > hs:
            gap = self.width - (self.bg_width * hs)
            self.blank_rect = ((self.width - gap, 0), (gap, self.height))
        else:
            gap = self.height - (self.bg_height * ws)
            self.blank_rect = ((0, self.height - gap), (self.width, gap))
params = params()


if __name__ == '__main__':
    GameApp().run()

所以我使用Richard Jones的例子来根据使用它的屏幕尺寸来设置图像的大小。这在1920年到1080时运行时效果很好但是当我将Window.size切换到720p时,缩小尺寸的图像在它们中有如此多的噪音,看起来很糟糕。 Ivied尝试使用线性和最近的mag_filter,并将卡的大小设置为dp(210.9)和dp(240),但它们的结果相同。有没有人知道更好的方法来缩小kivy使用不同的分辨率或解释如何使其工作的文档?原始图像尺寸为746×1037。

0 个答案:

没有答案