如何替换 Google Chrome 的低分辨率通知图标?

如何替换 Google Chrome 的低分辨率通知图标?

我最近在 Ubuntu 14.04 安装中将 Google Chrome 升级到了版本 35.0.1916.114。

从那时起,通知图标开始出现在系统托盘上。但是它似乎使用了低分辨率图标 - 看起来扭曲了:

在此处输入图片描述

我该如何修复/更换它?

答案1

编辑:有关更换通知图标的更新请参见下文

如果您的 chrome 二进制文件安装在典型位置,您会在 中找到它们/opt/google/chrome。在该文件夹中,您应该找到包含通知图标的文件chrome_100_percent.pak。以下是我提取它的步骤,使用来自这个堆栈溢出问题

  1. 签出代码到grit-i18n 项目

    svn checkout http://grit-i18n.googlecode.com/svn/trunk/ grit-i18n-read-only

  2. 这将在 CWD 中生成一个名为 的文件夹grit-i18n-read-only。CD 进入此文件夹

    cd grit-i18n-read-only

  3. 将 data_pack python 模块复制到此文件夹

    cp grit/format/data_pack.py .

  4. 在您喜欢的编辑器中编辑data_pack.py。初始导入后,添加以下行:

    sys.path.append(os.getcwd())

  5. 在函数文件末尾main,删除以下行

    print '%s: %s' % (resource_id, text)

    (Stack Overflow 的答案指出这发生在第 160 行,根据我的经验,当前版本发生在第 201 行)

  6. 在其位置上插入以下适当缩进的行(3 次):

    file = open(str(resource_id), "wb")

    file.write(text)

  7. 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(通过再次解压),我仍然无法替换系统托盘中的实际图标。

不幸的是我不知道为什么会这样。

相关内容