![如何替换 Google Chrome 的低分辨率通知图标?](https://linux22.com/image/855365/%E5%A6%82%E4%BD%95%E6%9B%BF%E6%8D%A2%20Google%20Chrome%20%E7%9A%84%E4%BD%8E%E5%88%86%E8%BE%A8%E7%8E%87%E9%80%9A%E7%9F%A5%E5%9B%BE%E6%A0%87%EF%BC%9F.png)
我最近在 Ubuntu 14.04 安装中将 Google Chrome 升级到了版本 35.0.1916.114。
从那时起,通知图标开始出现在系统托盘上。但是它似乎使用了低分辨率图标 - 看起来扭曲了:
我该如何修复/更换它?
答案1
编辑:有关更换通知图标的更新请参见下文
如果您的 chrome 二进制文件安装在典型位置,您会在 中找到它们/opt/google/chrome
。在该文件夹中,您应该找到包含通知图标的文件chrome_100_percent.pak
。以下是我提取它的步骤,使用来自这个堆栈溢出问题:
签出代码到grit-i18n 项目和
svn checkout http://grit-i18n.googlecode.com/svn/trunk/ grit-i18n-read-only
这将在 CWD 中生成一个名为 的文件夹
grit-i18n-read-only
。CD 进入此文件夹cd grit-i18n-read-only
将 data_pack python 模块复制到此文件夹
cp grit/format/data_pack.py .
在您喜欢的编辑器中编辑
data_pack.py
。初始导入后,添加以下行:sys.path.append(os.getcwd())
在函数文件末尾
main
,删除以下行print '%s: %s' % (resource_id, text)
(Stack Overflow 的答案指出这发生在第 160 行,根据我的经验,当前版本发生在第 201 行)
在其位置上插入以下适当缩进的行(3 次):
file = open(str(resource_id), "wb")
file.write(text)
data_pack.py
在 chrome pak 文件上运行该实用程序(我grit-i18n-read-only
首先将其复制到文件夹中):./data_pack.py ../chrome_100_percent.pak
这将导致当前目录中出现大量新文件,所有文件都以数字命名,没有扩展名。您的文件浏览器(例如 nautilus)应该能够确定文件类型并显示图像缩略图。我发现通知图标名为 6866 和 6867。
编辑
虽然下面有一些更简单的答案,但我设法拼凑了一些代码来重新打包资源,您可以在编辑图标后尝试。这将产生一个新.pak
文件,我自己还没有尝试使用过,所以我不能肯定地说这是否会成功产生新的通知图标。
在中的main函数中data_pack.py
,我注释掉了block里的所有代码else
,并添加了下面几行:
# Read in the modified icon resource files
file = open('6864', 'r')
icon1 = file.read()
file.close()
file = open('6865', 'r')
icon2 = file.read()
file.close()
file = open('6866', 'r')
icon3 = file.read()
file.close()
file = open('6867', 'r')
icon4 = file.read()
file.close()
# Write resource pak of only notification icons
iconData = {6864: icon1, 6865: icon2, 6866: icon3, 6867: icon4}
WriteDataPack(iconData, 'tmp.pak', BINARY)
# Create copy of original pak without notification icons
dataPack = ReadDataPack('chrome_100_percent.pak')
# List of icon resources to remove
toRemove = set([6864,6865,6866,6867])
whiteList = set(dataPack.resources.keys()).difference(toRemove)
whiteListFile = open('whitelist.txt', 'w')
for i in whiteList:
whiteListFile.write(str(i)+'\n')
whiteListFile.close()
newDataPack = RePack('tmp2.pak', ['chrome_100_percent.pak'], 'whitelist.txt')
# Merge the two paks together
combinedPack = RePack('chrome_100_percent_new.pak', ['tmp2.pak', 'tmp.pak'], None)
然后,只需运行./data_pack.py
。这假定chrome_100_percent.pak
位于当前目录中,并且应该会为您提供一个新chrome_100_percent_new.pak
文件,您可以尝试复制/opt/google/chrome/chrome_100_percent.pak
。
我相信资源包中与通知图标相关的一些附加图标已经被识别;编辑上述内容以包括这些图标应该非常简单。
最终编辑
现在我回到家,有机会继续研究这个问题,我成功地替换了 chrome 的通知图标。正如 @Glutanimate 所说,你只能使用 16x16 分辨率,所以我不确定你实际上能实现多少改进,但我认为这是主观的。
我只是在 GIMP 中打开了上述图标 (6864 - 6867),它将它们检测为灰度 PNG。我将一个新图标粘贴到 GIMP 中的同一个文件中,从而尝试保留相同的图像属性(例如灰度)。然后我将它们导出为 PNG,取消选中 GIMP 提供的所有选项,但保持压缩级别为 9。生成的文件有 .png 扩展名,所以我删除了这些扩展名并替换了原始文件。然后我重新运行data_pack.py
,已经进行了上面详述的修改。
我保留了原始 pak 的备份,mv /opt/google/chrome/chrome_100_percent.pak /opt/google/chrome/chrome_100_percent.bak
并将修改后的 .pak 文件移至其位置。我会确保在执行此操作时关闭 chrome,并仔细检查没有正在运行的 chrome 进程,我相信 chrome 有一个新设置,即使浏览器现在默认关闭,也可以允许后台进程。
瞧,Unity 中的通知图标反映了我的变化。
最终修改:好吧,我撒谎了——我尝试了 32x32 PNG,看起来效果很好。所以,就这样吧。以下是一些结果截图。
- 原始图标:您可能会在我的面板中的 Dropbox 和天气图标之间认出默认的“无未读通知”图标:
- 新图标:我的 32x32px 修改版本位于同一位置:
(来源:批次图标(作者:亚当·惠特克罗夫特)
答案2
编辑:
看起来问题出在node-chrome-pak
。rocketman10404 的修改版本data_pack.py
运行良好,即使使用 32px 图标也是如此:
请用他的指示反而。
原始答案:
@rocketman10404 的出色回答让我想到节点铬-pak,一个可以打包、解包和替换 Chrome/ium 文件中特定资源的 node.js 脚本.pak
。
虽然我已经设法用这个工具替换了通知图标chrome_100_percent.pak
,但我不得不说,我无法使更改可见。不过,我认为值得努力概述我为达到这一点所采取的步骤。希望其他人能接受这一点,并找到一种真正让它发挥作用的方法。
安装 node.js
node-chrome-pak
需要 node.js 才能运行。您可以通过添加 Chris Lea 的 nodejs PPA 来安装最新版本:
sudo add-apt-repository ppa:chris-lea/node.js
sudo apt-get update
sudo apt-get install nodejs
下载脚本并解压 Chrome 的资源
下载脚本:
git clone https://bitbucket.org/hikipro/node-chrome-pak.git
cd node-chrome-pak
复制本地chrome_100_percent.pak
文件:
cp /opt/google/chrome/chrome_100_percent.pak ./chrome_100_percent.pak
解压.pak
文件:
node ./main.js unpack chrome_100_percent.pak
识别和修改通知图标
最后一个操作将创建一个名为 的新文件夹./extracted
。您将在其中找到 pak 文件中包含的所有资源。它们以其资源 ID 命名。您将希望保留此名称,因为它对于重新打包文件很重要。
现在最难的部分是识别正确的图标。如果我没有记错的话,系统托盘中使用的文件应该是以下文件:
6864.png
6865.png
6866.png
6867.png
找到您要查找的图标后,您可以继续修改和替换它们。如果您愿意,可以使用我为此目的创建的图标:
不同分辨率的源文件和导出.png
文件托管在GitHub。
以下是我发现的第一个限制:如果你用任何分辨率高于原始分辨率的图像替换图标,Google Chrome 将会损坏并停止正常工作。对于这个特定项目,您必须使用 16x16 分辨率。实际上,这意味着即使您采用此方法,也无法显著改善当前的系统托盘图标。
当然,这种限制可能是在node-chrome-pak
设计时引入的。如果您根据@rocketman10404 的回答创建自定义 Python 脚本,则可能可以将图标替换为更大的图标。
重新打包资源并替换现有资源
修改/替换现有图标后,您必须创建一个更新的pak
文件......
node ./main.js pack ./extracted ./chrome_100_percent_modified.pak
...并用它来替换现有的:
sudo cp ./chrome_100_percent_modified.pak /opt/google/chrome/chrome_100_percent.pak
此方法的关键
在我尝试的过程中,我没能使 Chrome 显示更新后的图标。即使我确定所有图标都已正确替换,并且确实存在于修改后的文件中pak
(通过再次解压),我仍然无法替换系统托盘中的实际图标。
不幸的是我不知道为什么会这样。