Почему эти jpeg-файлы работают с плиточным редактором карт, но не с png-файлами?

Я пытаюсь отобразить мозаичную карту в pygame, и я хочу использовать png, потому что они прозрачны, однако, когда я перетаскиваю плитки в окно, 4/6 разных плиток отображаются нормально, но 2 плитки не отображаются (трава сверху и грязь в центре). Когда я пытаюсь сделать то же самое с jpeg-файлами, карта отображается нормально, но, поскольку они непрозрачны, я не хочу их использовать.

Вот что отображается в формате jpeg: https://gyazo.com/f4bcd87763ebdcb718759cdc3e5132ba

Вот что отображается в формате png: https://gyazo.com/df286b8d6f23d0f622de097eb423ea7c

Также я получаю спам с этим сообщением: «Предупреждение libpng: iCCP: известный неверный профиль sRGB», но мне сказали, что это неважно.

mainGame.py

import pygame
from settings import *
from Loading import *
from characters import *
import pytmx

pygame.init()

class game():

    def __init__(self):

        self.gameRunning = True
        self.gameWindow = pygame.display.set_mode((gameWindowWidth, gameWindowHeight))
        self.clock = pygame.time.Clock()
        self.playerSpeed = speed
        self.preloadedData = load()

    def update(self):

        pygame.display.set_caption("{:.2f}".format(self.clock.get_fps()))
        #self.gameWindow.blit(self.preloadedData["distantCity"], (0,0))
        self.gameWindow.blit(self.preloadedData["ninjaIdle01"], (player1.playerX, player1.playerY))
        pygame.display.update()

    def loadMap(self):

        self.map = tiledMap()
        self.map_img = self.map.make_map()
        self.gameWindow.blit(self.map_img, (0,624))

    def gameLoop(self):

        self.clock.tick(FPS)
        self.event()
        self.update()
        self.loadMap()

    def event(self):

        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                self.gameRunning = False

            if event.type == pygame.KEYDOWN and event.key == pygame.K_RIGHT:
                self.playerSpeed = 5
            if event.type == pygame.KEYDOWN and event.key == pygame.K_LEFT:
                self.playerSpeed = -5
            if event.type == pygame.KEYUP and event.key == pygame.K_RIGHT:
                self.playerSpeed = 0
            if event.type == pygame.KEYUP and event.key == pygame.K_LEFT:
                self.playerSpeed = 0

        player1.playerX = player1.playerX + self.playerSpeed

playGame = game()
player1 = player()
while playGame.gameRunning == True:
    playGame.gameLoop()


pygame.quit()
quit()

loading.py

import pygame
import pytmx

pygame.init()

def load():

    loaded = {}
    loaded["ninjaIdle01"] = pygame.image.load("gameImages\s_ninjaIdle_01.png")
    loaded["ninjaIdle02"] = pygame.image.load("gameImages\s_ninjaIdle_02.png")
    loaded["ninjaIdle03"] = pygame.image.load("gameImages\s_ninjaIdle_03.png")
    loaded["ninjaIdle04"] = pygame.image.load("gameImages\s_ninjaIdle_04.png")
    loaded["ninjaIdle05"] = pygame.image.load("gameImages\s_ninjaIdle_05.png")
    loaded["ninjaIdle06"] = pygame.image.load("gameImages\s_ninjaIdle_06.png")
    loaded["ninjaIdle07"] = pygame.image.load("gameImages\s_ninjaIdle_07.png")
    loaded["ninjaIdle08"] = pygame.image.load("gameImages\s_ninjaIdle_08.png")
    loaded["ninjaIdle09"] = pygame.image.load("gameImages\s_ninjaIdle_09.png")
    loaded["ninjaIdle10"] = pygame.image.load("gameImages\s_ninjaIdle_10.png")
    loaded["ninjaJump01"] = pygame.image.load("gameImages\s_ninjaJump_01.png")
    loaded["ninjaJump02"] = pygame.image.load("gameImages\s_ninjaJump_02.png")
    loaded["ninjaJump03"] = pygame.image.load("gameImages\s_ninjaJump_03.png")
    loaded["ninjaJump04"] = pygame.image.load("gameImages\s_ninjaJump_04.png")
    loaded["ninjaJump05"] = pygame.image.load("gameImages\s_ninjaJump_05.png")
    loaded["ninjaJump06"] = pygame.image.load("gameImages\s_ninjaJump_06.png")
    loaded["ninjaJump07"] = pygame.image.load("gameImages\s_ninjaJump_07.png")
    loaded["ninjaJump08"] = pygame.image.load("gameImages\s_ninjaJump_08.png")
    loaded["ninjaJump09"] = pygame.image.load("gameImages\s_ninjaJump_09.png")
    loaded["ninjaJump010"] = pygame.image.load("gameImages\s_ninjaJump_10.png")
    loaded["ninjaRun01"] = pygame.image.load("gameImages\s_ninjaRun_01.png")
    loaded["ninjaRun02"] = pygame.image.load("gameImages\s_ninjaRun_02.png")
    loaded["ninjaRun03"] = pygame.image.load("gameImages\s_ninjaRun_03.png")
    loaded["ninjaRun04"] = pygame.image.load("gameImages\s_ninjaRun_04.png")
    loaded["ninjaRun05"] = pygame.image.load("gameImages\s_ninjaRun_05.png")
    loaded["ninjaRun06"] = pygame.image.load("gameImages\s_ninjaRun_06.png")
    loaded["ninjaRun07"] = pygame.image.load("gameImages\s_ninjaRun_07.png")
    loaded["ninjaRun08"] = pygame.image.load("gameImages\s_ninjaRun_08.png")
    loaded["ninjaRun09"] = pygame.image.load("gameImages\s_ninjaRun_09.png")
    loaded["ninjaRun10"] = pygame.image.load("gameImages\s_ninjaRun_10.png")
    loaded["distantCity"] = pygame.image.load("gameImages\s_distantCity.png").convert()
    return loaded

class tiledMap():
    def __init__(self):
        self.gameMap = pytmx.load_pygame("s_gameMapJPG.tmx", pixelalpha=True)
        self.mapwidth = self.gameMap.tilewidth * self.gameMap.width
        self.mapheight = self.gameMap.tileheight * self.gameMap.height

    def render(self, surface):
        for layer in self.gameMap.visible_layers:
            if isinstance(layer, pytmx.TiledTileLayer):
                for x, y, gid in layer:
                    tile = self.gameMap.get_tile_image_by_gid(gid)
                    surface.blit(tile, (x * self.gameMap.tilewidth, y * self.gameMap.tileheight))

    def make_map(self):
        mapSurface = pygame.Surface((640, 96))
        self.render(mapSurface)
        return mapSurface

s_gameMap.tmx

<?xml version="1.0" encoding="UTF-8"?>
<map version="1.0" orientation="orthogonal" renderorder="right-down" width="20" height="3" tilewidth="32" tileheight="32" nextobjectid="1">
 <tileset firstgid="1" name="isTiles" tilewidth="32" tileheight="32" tilecount="6" columns="0">
  <tile id="0">
   <image width="32" height="32" source="gameImages/s_grassLeft.png"/>
  </tile>
  <tile id="1">
   <image width="32" height="32" source="gameImages/s_grassMiddle.png"/>
  </tile>
  <tile id="2">
   <image width="32" height="32" source="gameImages/s_grassRight.png"/>
  </tile>
  <tile id="3">
   <image width="32" height="32" source="gameImages/s_dirtLeft.png"/>
  </tile>
  <tile id="4">
   <image width="32" height="32" source="gameImages/s_dirtMiddle.png"/>
  </tile>
  <tile id="5">
   <image width="32" height="32" source="gameImages/s_dirtRight.png"/>
  </tile>
 </tileset>
 <layer name="Tile Layer 1" width="20" height="3">
  <data encoding="csv">
1,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,3,
4,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,6,
4,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,6
</data>
 </layer>
</map>

s_gameMapJPG.tmx

<?xml version="1.0" encoding="UTF-8"?>
<map version="1.0" orientation="orthogonal" renderorder="right-down" width="20" height="3" tilewidth="32" tileheight="32" nextobjectid="1">
 <tileset firstgid="1" name="small jpeg tiles" tilewidth="32" tileheight="32" tilecount="6" columns="0">
  <tile id="0">
   <image width="32" height="32" source="gameImages/s_grassRightJPG.jpg"/>
  </tile>
  <tile id="1">
   <image width="32" height="32" source="gameImages/s_grassMiddleJPG.jpg"/>
  </tile>
  <tile id="2">
   <image width="32" height="32" source="gameImages/s_grassLeftJPG.jpg"/>
  </tile>
  <tile id="3">
   <image width="32" height="32" source="gameImages/s_dirtRightJPG.jpg"/>
  </tile>
  <tile id="4">
   <image width="32" height="32" source="gameImages/s_dirtMiddleJPG.jpg"/>
  </tile>
  <tile id="5">
   <image width="32" height="32" source="gameImages/s_dirtLeftJPG.jpg"/>
  </tile>
 </tileset>
 <layer name="Tile Layer 1" width="20" height="3">
  <data encoding="csv">
3,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1,
6,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,4,
6,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,4
</data>
 </layer>
</map>

person CustomerSupport    schedule 26.01.2017    source источник
comment
добавьте изображение png, чтобы увидеть проблему   -  person furas    schedule 26.01.2017
comment
Извините, но не могли бы вы пояснить, что вы имеете в виду, говоря «добавить изображение PNG»?   -  person CustomerSupport    schedule 26.01.2017
comment
добавить png-изображение с травой, чтобы мы могли проверить код с этим профилем sRGB. Может это как-то связано с этой проблемой.   -  person furas    schedule 26.01.2017
comment
Кстати: вы пробовали использовать другой PNG, который не показывает сообщение о профиле sRGB. Или вы пробовали конвертировать этот PNG в RGB или RGBA?   -  person furas    schedule 26.01.2017
comment
Вот ссылка для загрузки одного из изображений, которое не работает: dropbox .com / s / osj744oucagfn9w / grassMiddle.png? dl = 0 единственное различие, которое я заметил между рабочими изображениями и теми, которые не работали, те, которые не работали, не имели прозрачных частей и у тех, которые действительно работали, были какие-то прозрачные детали, если это вообще помогает.   -  person CustomerSupport    schedule 27.01.2017
comment
Я попробовал этот образ, увидел предупреждение "libpng warning: iCCP:" (впервые в жизни :), но у меня он работает в Linux. Но это может зависеть от системы. Я использовал ImageMagic для преобразования png в png, поэтому я получил файл меньшего размера, и после этого он не показывает предупреждения. Я использовал ImageMagic для отображения некоторой информации об обоих файлах, и они идентичны, за исключением Profile-icc - в моей версии его нет. imagemagick.org/script/identify.php   -  person furas    schedule 27.01.2017
comment
Итак, следует ли мне попробовать преобразовать свои изображения из png в png с помощью ImageMagick и посмотреть, работает ли это?   -  person CustomerSupport    schedule 27.01.2017
comment
да, попробуйте преобразовать файл (с помощью любой программы) и, возможно, вы получите версию без Profile, а затем попытаетесь отобразить ее.   -  person furas    schedule 27.01.2017
comment
Хорошо, моя проблема решена, я попытался удалить альфа-канал из этих изображений, поскольку они не имели видимой прозрачности и по какой-то причине это устранило мою проблему. Спасибо за помощь в сортировке проблемы с моим профилем.   -  person CustomerSupport    schedule 27.01.2017


Ответы (1)


Положите trans="ffffff" на каждую местность

<image width="32" height="32" trans="ffffff" source="gameImages/s_grassLeft.png"/>
person Claude Dominicé    schedule 24.01.2019