Use Resmapling.LANCZOS only on PIL > v8, include RTL -H and -d switches only when using RTL.
This commit is contained in:
parent
a3068acddc
commit
6069f6c503
49
nrsc5-dui.py
49
nrsc5-dui.py
@ -24,7 +24,14 @@ import os, pty, select, sys, shutil, re, json, datetime, numpy, glob, time, plat
|
|||||||
from subprocess import Popen, PIPE
|
from subprocess import Popen, PIPE
|
||||||
from threading import Timer, Thread
|
from threading import Timer, Thread
|
||||||
from dateutil import tz
|
from dateutil import tz
|
||||||
from PIL import Image, ImageFont, ImageDraw
|
from PIL import Image, ImageFont, ImageDraw, __version__
|
||||||
|
|
||||||
|
print('Using Pillow v'+__version__)
|
||||||
|
|
||||||
|
if (int(__version__[0]) < 9):
|
||||||
|
imgLANCZOS = Image.LANCZOS
|
||||||
|
else:
|
||||||
|
imgLANCZOS = Image.Resampling.LANCZOS
|
||||||
|
|
||||||
import gi
|
import gi
|
||||||
gi.require_version("Gtk", "3.0")
|
gi.require_version("Gtk", "3.0")
|
||||||
@ -51,7 +58,8 @@ cfgDir = os.path.join(runtimeDir, "cfg") # config file directory
|
|||||||
|
|
||||||
class NRSC5_DUI(object):
|
class NRSC5_DUI(object):
|
||||||
def __init__(self):
|
def __init__(self):
|
||||||
global runtimeDir, resDir
|
global runtimeDir, resDir, imgLANCZOS
|
||||||
|
|
||||||
self.windowsOS = False # save our determination as a var in case we change how we determine.
|
self.windowsOS = False # save our determination as a var in case we change how we determine.
|
||||||
|
|
||||||
self.getControls() # get controls and windows
|
self.getControls() # get controls and windows
|
||||||
@ -76,7 +84,7 @@ class NRSC5_DUI(object):
|
|||||||
self.debugLog("OS Determination: Windows = {}".format(self.windowsOS))
|
self.debugLog("OS Determination: Windows = {}".format(self.windowsOS))
|
||||||
|
|
||||||
self.app_name = "NRSC5-DUI"
|
self.app_name = "NRSC5-DUI"
|
||||||
self.version = "2.2.0"
|
self.version = "2.2.1"
|
||||||
self.web_addr = "https://github.com/markjfine/nrsc5-dui"
|
self.web_addr = "https://github.com/markjfine/nrsc5-dui"
|
||||||
self.copyright = "Copyright © 2017-2019 Cody Nybo & Clayton Smith, 2019 zefie, 2021-2022 Mark J. Fine"
|
self.copyright = "Copyright © 2017-2019 Cody Nybo & Clayton Smith, 2019 zefie, 2021-2022 Mark J. Fine"
|
||||||
musicbrainzngs.set_useragent(self.app_name,self.version,self.web_addr)
|
musicbrainzngs.set_useragent(self.app_name,self.version,self.web_addr)
|
||||||
@ -337,7 +345,7 @@ class NRSC5_DUI(object):
|
|||||||
return result
|
return result
|
||||||
|
|
||||||
def on_cover_resize(self, container):
|
def on_cover_resize(self, container):
|
||||||
global mapDir
|
global mapDir, imgLANCZOS
|
||||||
if (self.did_resize()):
|
if (self.did_resize()):
|
||||||
self.showArtwork(self.coverImage)
|
self.showArtwork(self.coverImage)
|
||||||
|
|
||||||
@ -345,13 +353,13 @@ class NRSC5_DUI(object):
|
|||||||
if (self.mapData["mapMode"] == 0):
|
if (self.mapData["mapMode"] == 0):
|
||||||
map_file = os.path.join(mapDir, "TrafficMap.png")
|
map_file = os.path.join(mapDir, "TrafficMap.png")
|
||||||
if os.path.isfile(map_file):
|
if os.path.isfile(map_file):
|
||||||
map_img = Image.open(map_file).resize((img_size, img_size), Image.Resampling.LANCZOS)
|
map_img = Image.open(map_file).resize((img_size, img_size), imgLANCZOS)
|
||||||
self.imgMap.set_from_pixbuf(self.img_to_pixbuf(map_img))
|
self.imgMap.set_from_pixbuf(self.img_to_pixbuf(map_img))
|
||||||
else:
|
else:
|
||||||
self.imgMap.set_from_icon_name("MISSING_IMAGE", Gtk.IconSize.DIALOG)
|
self.imgMap.set_from_icon_name("MISSING_IMAGE", Gtk.IconSize.DIALOG)
|
||||||
elif (self.mapData["mapMode"] == 1):
|
elif (self.mapData["mapMode"] == 1):
|
||||||
if os.path.isfile(self.mapData["weatherNow"]):
|
if os.path.isfile(self.mapData["weatherNow"]):
|
||||||
map_img = Image.open(self.mapData["weatherNow"]).resize((img_size, img_size), Image.Resampling.LANCZOS)
|
map_img = Image.open(self.mapData["weatherNow"]).resize((img_size, img_size), imgLANCZOS)
|
||||||
self.imgMap.set_from_pixbuf(self.img_to_pixbuf(map_img))
|
self.imgMap.set_from_pixbuf(self.img_to_pixbuf(map_img))
|
||||||
else:
|
else:
|
||||||
self.imgMap.set_from_icon_name("MISSING_IMAGE", Gtk.IconSize.DIALOG)
|
self.imgMap.set_from_icon_name("MISSING_IMAGE", Gtk.IconSize.DIALOG)
|
||||||
@ -596,7 +604,7 @@ class NRSC5_DUI(object):
|
|||||||
self.nrsc5Args.append(aasDir)
|
self.nrsc5Args.append(aasDir)
|
||||||
|
|
||||||
# set IP address if rtl_tcp is used
|
# set IP address if rtl_tcp is used
|
||||||
if (self.cbDevIP.get_active()):
|
if (not(useSDRPlay)) and (self.cbDevIP.get_active()):
|
||||||
self.nrsc5Args.append("-H")
|
self.nrsc5Args.append("-H")
|
||||||
self.nrsc5Args.append(self.txtDevIP.get_text())
|
self.nrsc5Args.append(self.txtDevIP.get_text())
|
||||||
|
|
||||||
@ -612,7 +620,7 @@ class NRSC5_DUI(object):
|
|||||||
self.nrsc5Args.append(str(int(self.spinPPM.get_value())))
|
self.nrsc5Args.append(str(int(self.spinPPM.get_value())))
|
||||||
|
|
||||||
# set rtl device number if not zero
|
# set rtl device number if not zero
|
||||||
if (self.spinRTL.get_value() != 0):
|
if (not(useSDRPlay)) and (self.spinRTL.get_value() != 0):
|
||||||
self.nrsc5Args.append("-d")
|
self.nrsc5Args.append("-d")
|
||||||
self.nrsc5Args.append(str(int(self.spinRTL.get_value())))
|
self.nrsc5Args.append(str(int(self.spinRTL.get_value())))
|
||||||
|
|
||||||
@ -916,7 +924,7 @@ class NRSC5_DUI(object):
|
|||||||
self.btnDelete.set_sensitive(iter is not None)
|
self.btnDelete.set_sensitive(iter is not None)
|
||||||
|
|
||||||
def on_radMap_toggled(self, btn):
|
def on_radMap_toggled(self, btn):
|
||||||
global mapDir
|
global mapDir, imgLANCZOS
|
||||||
if (btn.get_active()):
|
if (btn.get_active()):
|
||||||
img_size = min(self.alignmentMap.get_allocated_height(), self.alignmentMap.get_allocated_width()) - 12
|
img_size = min(self.alignmentMap.get_allocated_height(), self.alignmentMap.get_allocated_width()) - 12
|
||||||
if (img_size < 200):
|
if (img_size < 200):
|
||||||
@ -925,7 +933,7 @@ class NRSC5_DUI(object):
|
|||||||
self.mapData["mapMode"] = 0
|
self.mapData["mapMode"] = 0
|
||||||
mapFile = os.path.join(mapDir, "TrafficMap.png")
|
mapFile = os.path.join(mapDir, "TrafficMap.png")
|
||||||
if (os.path.isfile(mapFile)): # check if map exists
|
if (os.path.isfile(mapFile)): # check if map exists
|
||||||
mapImg = Image.open(mapFile).resize((img_size, img_size), Image.Resampling.LANCZOS) # scale map to fit window
|
mapImg = Image.open(mapFile).resize((img_size, img_size), imgLANCZOS) # scale map to fit window
|
||||||
self.imgMap.set_from_pixbuf(imgToPixbuf(mapImg)) # convert image to pixbuf and display
|
self.imgMap.set_from_pixbuf(imgToPixbuf(mapImg)) # convert image to pixbuf and display
|
||||||
else:
|
else:
|
||||||
self.imgMap.set_from_icon_name("MISSING_IMAGE", Gtk.IconSize.DIALOG) # display missing image if file is not found
|
self.imgMap.set_from_icon_name("MISSING_IMAGE", Gtk.IconSize.DIALOG) # display missing image if file is not found
|
||||||
@ -933,7 +941,7 @@ class NRSC5_DUI(object):
|
|||||||
elif (btn == self.radMapWeather):
|
elif (btn == self.radMapWeather):
|
||||||
self.mapData["mapMode"] = 1
|
self.mapData["mapMode"] = 1
|
||||||
if (os.path.isfile(self.mapData["weatherNow"])):
|
if (os.path.isfile(self.mapData["weatherNow"])):
|
||||||
mapImg = Image.open(self.mapData["weatherNow"]).resize((img_size, img_size), Image.Resampling.LANCZOS) # scale map to fit window
|
mapImg = Image.open(self.mapData["weatherNow"]).resize((img_size, img_size), imgLANCZOS) # scale map to fit window
|
||||||
self.imgMap.set_from_pixbuf(imgToPixbuf(mapImg)) # convert image to pixbuf and display
|
self.imgMap.set_from_pixbuf(imgToPixbuf(mapImg)) # convert image to pixbuf and display
|
||||||
else:
|
else:
|
||||||
self.imgMap.set_from_icon_name("MISSING_IMAGE", Gtk.IconSize.DIALOG) # display missing image if file is not found
|
self.imgMap.set_from_icon_name("MISSING_IMAGE", Gtk.IconSize.DIALOG) # display missing image if file is not found
|
||||||
@ -1148,7 +1156,7 @@ class NRSC5_DUI(object):
|
|||||||
self.statusTimer.start()
|
self.statusTimer.start()
|
||||||
|
|
||||||
def processTrafficMap(self, fileName):
|
def processTrafficMap(self, fileName):
|
||||||
global aasDir, mapDir
|
global aasDir, mapDir, imgLANCZOS
|
||||||
r = re.compile("^[\d]+_TMT_.*_([1-3])_([1-3])_([\d]{4})([\d]{2})([\d]{2})_([0-9A-Fa-f]{2})([0-9A-Fa-f]{2})_([0-9A-Fa-f]{4})\..*$") # match file name
|
r = re.compile("^[\d]+_TMT_.*_([1-3])_([1-3])_([\d]{4})([\d]{2})([\d]{2})_([0-9A-Fa-f]{2})([0-9A-Fa-f]{2})_([0-9A-Fa-f]{4})\..*$") # match file name
|
||||||
m = r.match(fileName)
|
m = r.match(fileName)
|
||||||
|
|
||||||
@ -1201,7 +1209,7 @@ class NRSC5_DUI(object):
|
|||||||
imgBig = (981,981) # size of a weather map
|
imgBig = (981,981) # size of a weather map
|
||||||
posTS = (imgBig[0]-235, imgBig[1]-29) # calculate position to put timestamp (bottom right)
|
posTS = (imgBig[0]-235, imgBig[1]-29) # calculate position to put timestamp (bottom right)
|
||||||
imgTS = self.mkTimestamp(t, imgBig, posTS) # create timestamp for a weather map
|
imgTS = self.mkTimestamp(t, imgBig, posTS) # create timestamp for a weather map
|
||||||
imgTS = imgTS.resize((imgMap.size[0], imgMap.size[1]), Image.Resampling.LANCZOS) # resize it so it's proportional to the size of a traffic map (981 -> 600)
|
imgTS = imgTS.resize((imgMap.size[0], imgMap.size[1]), imgLANCZOS) # resize it so it's proportional to the size of a traffic map (981 -> 600)
|
||||||
imgMap = Image.alpha_composite(imgMap, imgTS) # overlay timestamp on traffic map
|
imgMap = Image.alpha_composite(imgMap, imgTS) # overlay timestamp on traffic map
|
||||||
|
|
||||||
imgMap.save(os.path.join(mapDir, "TrafficMap.png")) # save traffic map
|
imgMap.save(os.path.join(mapDir, "TrafficMap.png")) # save traffic map
|
||||||
@ -1209,13 +1217,13 @@ class NRSC5_DUI(object):
|
|||||||
# display on map page
|
# display on map page
|
||||||
if (self.radMapTraffic.get_active()):
|
if (self.radMapTraffic.get_active()):
|
||||||
img_size = min(self.alignmentMap.get_allocated_height(), self.alignmentMap.get_allocated_width()) - 12
|
img_size = min(self.alignmentMap.get_allocated_height(), self.alignmentMap.get_allocated_width()) - 12
|
||||||
imgMap = imgMap.resize((img_size, img_size), Image.Resampling.LANCZOS) # scale map to fit window
|
imgMap = imgMap.resize((img_size, img_size), imgLANCZOS) # scale map to fit window
|
||||||
self.imgMap.set_from_pixbuf(imgToPixbuf(imgMap)) # convert image to pixbuf and display
|
self.imgMap.set_from_pixbuf(imgToPixbuf(imgMap)) # convert image to pixbuf and display
|
||||||
|
|
||||||
if (self.mapViewer is not None): self.mapViewer.updated(0) # notify map viwerer if it's open
|
if (self.mapViewer is not None): self.mapViewer.updated(0) # notify map viwerer if it's open
|
||||||
|
|
||||||
def processWeatherOverlay(self, fileName):
|
def processWeatherOverlay(self, fileName):
|
||||||
global aasDir, mapDir
|
global aasDir, mapDir, imgLANCZOS
|
||||||
r = re.compile("^[\d]+_DWRO_(.*)_.*_([\d]{4})([\d]{2})([\d]{2})_([\d]{2})([\d]{2})_([0-9A-Fa-f]+)\..*$") # match file name
|
r = re.compile("^[\d]+_DWRO_(.*)_.*_([\d]{4})([\d]{2})([\d]{2})_([\d]{2})([\d]{2})_([0-9A-Fa-f]+)\..*$") # match file name
|
||||||
m = r.match(fileName)
|
m = r.match(fileName)
|
||||||
|
|
||||||
@ -1264,7 +1272,7 @@ class NRSC5_DUI(object):
|
|||||||
posTS = (imgMap.size[0]-235, imgMap.size[1]-29) # calculate position to put timestamp (bottom right)
|
posTS = (imgMap.size[0]-235, imgMap.size[1]-29) # calculate position to put timestamp (bottom right)
|
||||||
imgTS = self.mkTimestamp(t, imgMap.size, posTS) # create timestamp
|
imgTS = self.mkTimestamp(t, imgMap.size, posTS) # create timestamp
|
||||||
imgRadar = Image.open(wxOlPath).convert("RGBA") # open radar overlay
|
imgRadar = Image.open(wxOlPath).convert("RGBA") # open radar overlay
|
||||||
imgRadar = imgRadar.resize(imgMap.size, Image.Resampling.LANCZOS) # resize radar overlay to fit the map
|
imgRadar = imgRadar.resize(imgMap.size, imgLANCZOS) # resize radar overlay to fit the map
|
||||||
imgMap = Image.alpha_composite(imgMap, imgRadar) # overlay radar image on map
|
imgMap = Image.alpha_composite(imgMap, imgRadar) # overlay radar image on map
|
||||||
imgMap = Image.alpha_composite(imgMap, imgTS) # overlay timestamp
|
imgMap = Image.alpha_composite(imgMap, imgTS) # overlay timestamp
|
||||||
imgMap.save(wxMapPath) # save weather map
|
imgMap.save(wxMapPath) # save weather map
|
||||||
@ -1274,7 +1282,7 @@ class NRSC5_DUI(object):
|
|||||||
# display on map page
|
# display on map page
|
||||||
if (self.radMapWeather.get_active()):
|
if (self.radMapWeather.get_active()):
|
||||||
img_size = min(self.alignmentMap.get_allocated_height(), self.alignmentMap.get_allocated_width()) - 12
|
img_size = min(self.alignmentMap.get_allocated_height(), self.alignmentMap.get_allocated_width()) - 12
|
||||||
imgMap = imgMap.resize((img_size, img_size), Image.Resampling.LANCZOS) # scale map to fit window
|
imgMap = imgMap.resize((img_size, img_size), imgLANCZOS) # scale map to fit window
|
||||||
self.imgMap.set_from_pixbuf(imgToPixbuf(imgMap)) # convert image to pixbuf and display
|
self.imgMap.set_from_pixbuf(imgToPixbuf(imgMap)) # convert image to pixbuf and display
|
||||||
|
|
||||||
self.proccessWeatherMaps() # get rid of old maps and add new ones to the list
|
self.proccessWeatherMaps() # get rid of old maps and add new ones to the list
|
||||||
@ -2122,12 +2130,13 @@ class NRSC5_Map(object):
|
|||||||
self.callback() # run the callback
|
self.callback() # run the callback
|
||||||
|
|
||||||
def animate(self):
|
def animate(self):
|
||||||
|
global imgLANCZOS
|
||||||
fileName = self.weatherMaps[self.mapIndex] if len(self.weatherMaps) else ""
|
fileName = self.weatherMaps[self.mapIndex] if len(self.weatherMaps) else ""
|
||||||
if (os.path.isfile(fileName)):
|
if (os.path.isfile(fileName)):
|
||||||
self.animateBusy = True # set busy to true
|
self.animateBusy = True # set busy to true
|
||||||
|
|
||||||
if (self.config["scale"]):
|
if (self.config["scale"]):
|
||||||
mapImg = imgToPixbuf(Image.open(fileName).resize((600,600), Image.Resampling.LANCZOS)) # open weather map, resize to 600x600, and convert to pixbuf
|
mapImg = imgToPixbuf(Image.open(fileName).resize((600,600), imgLANCZOS)) # open weather map, resize to 600x600, and convert to pixbuf
|
||||||
else:
|
else:
|
||||||
mapImg = imgToPixbuf(Image.open(fileName)) # open weather map and convert to pixbuf
|
mapImg = imgToPixbuf(Image.open(fileName)) # open weather map and convert to pixbuf
|
||||||
|
|
||||||
@ -2150,9 +2159,11 @@ class NRSC5_Map(object):
|
|||||||
self.mapIndex = 0
|
self.mapIndex = 0
|
||||||
|
|
||||||
def showImage(self, fileName, scale):
|
def showImage(self, fileName, scale):
|
||||||
|
global imgLANCZOS
|
||||||
|
|
||||||
if (os.path.isfile(fileName)):
|
if (os.path.isfile(fileName)):
|
||||||
if (scale):
|
if (scale):
|
||||||
mapImg = Image.open(fileName).resize((600,600), Image.Resampling.LANCZOS) # open and scale map to fit window
|
mapImg = Image.open(fileName).resize((600,600), imgLANCZOS) # open and scale map to fit window
|
||||||
else:
|
else:
|
||||||
mapImg = Image.open(fileName) # open map
|
mapImg = Image.open(fileName) # open map
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user