如何替换谷歌浏览器的低分辨率通知图标?

fab*_*aia 15 notification icons google-chrome

Google Chrome 最近在我的 Ubuntu 14.04 安装上升级到版本 35.0.1916.114。

从那时起,通知图标开始出现在系统托盘上。然而,它似乎使用的是低分辨率图标 - 它看起来失真:

在此处输入图片说明

我该如何修复/更换它?

小智 14

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

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

  1. 代码结帐的砂砾,国际化的项目

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

  2. 这将在 CWD 中为您提供一个名为grit-i18n-read-only. 光盘放入此文件夹

    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)

    (堆栈溢出答案指出这发生在第 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文件,我自己没有尝试使用它,所以我不能肯定地说这会成功产生新的通知图标。

在主函数中data_pack.py,我注释掉了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)
Run Code Online (Sandbox Code Playgroud)

然后,只需运行./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 修改版本:

新图标

(来源:来自 Adam Whitcroft 的批处理图标


Glu*_*ate 8

编辑:

看起来问题出在node-chrome-pak. Rocketman10404 的修改data_pack.py工作正常,即使使用 32px 图标:

在此处输入图片说明

请改用他的指示


原答案

@rocketman10404 的出色回答让我想到了node-chrome-pak,这是一个 node.js 脚本,可以打包、解包和替换 Chrome/ium.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
Run Code Online (Sandbox Code Playgroud)

下载脚本并解压 Chrome 的资源

下载脚本:

git clone https://bitbucket.org/hikipro/node-chrome-pak.git
cd node-chrome-pak
Run Code Online (Sandbox Code Playgroud)

复制您的本地chrome_100_percent.pak

cp /opt/google/chrome/chrome_100_percent.pak ./chrome_100_percent.pak
Run Code Online (Sandbox Code Playgroud)

解压.pak文件:

node ./main.js unpack chrome_100_percent.pak
Run Code Online (Sandbox Code Playgroud)

识别和修改通知图标

最后一个操作将创建一个名为 的新文件夹./extracted。您将在其中找到 pak 文件中包含的所有资源。它们以其资源 ID 命名。您将希望保留此名称,因为它对于重新打包文件很重要。

现在困难的部分在于识别正确的图标。如果我没有完全弄错,以下文件应该是系统托盘中使用的文件:

6864.png
6865.png
6866.png
6867.png
Run Code Online (Sandbox Code Playgroud)

确定您要查找的图标后,您可以继续修改和替换它们。如果您愿意,可以使用我为此目的创建的图标:

      

      

.png不同分辨率的源文件和导出的文件托管在GitHub 上

这是我发现的第一个限制:如果您用任何分辨率高于原始 Google Chrome 的图像替换图标,将会损坏并停止正常工作。对于这个特定的项目,您必须保持 16x16 的分辨率。实际上,这意味着您将无法显着改进当前的系统托盘图标,即使您要使用此方法。

当然,这种限制是由node-chrome-pak设计方式引入的。如果您根据@rocketman10404 的答案创建自定义 python 脚本,则可以用更大的图标替换图标。

重新打包资源并替换现有资源

修改/替换现有图标后,您必须创建一个更新的pak文件...

node ./main.js pack ./extracted ./chrome_100_percent_modified.pak
Run Code Online (Sandbox Code Playgroud)

...并用它来替换现有的:

sudo cp ./chrome_100_percent_modified.pak /opt/google/chrome/chrome_100_percent.pak
Run Code Online (Sandbox Code Playgroud)

这个方法的关键

在我的尝试中,我无法让 Chrome 显示更新的图标。即使我确保所有图标都被正确替换并实际存在于修改后的pak文件中(通过再次解压缩),我仍然无法替换系统托盘中的实际图标。

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