風柳メモ

ソフトウェア・プログラミング関連の覚書が中心

【覚書】 Twitter の画像サイズの変換など(PNG・JPEG)

Twitter に画像(PNG・JPEG)をアップロードし、これを表示する際、URLの末尾によってそれぞれ異なるサイズの画像が得られるが、これに関する覚え書きなど。



Twitter の画像サイズ種別

Twitter にアップロードした画像は、以下のような URL で参照(表示)できる。

https://pbs.twimg.com/media/~.<拡張子>[:サイズ種別]

サイズ種別は以下のようになっている。

:サイズ種別 最大サイズ(*1)
:thumb 150px×150px
:small 680px×680px 横340px(*2)
680px×680px(*3)
:medium
(なし)
1200px×1200px 横600px(*2)
1200px×1200px(*3)
:large 2048px×2048px 横1024px(*2)
2048px×2048px(*3)
:orig (制限なしか?) 横8000px(?)(*2)
4096px×4096px(*3)

(*1) このサイズ内の画像は原寸で取得できるが、それ以上のものは矩形に収まるよう縮小される(:thumbについては、短辺に合わせてトリミング&リサイズされているものと思われる)。
なお、各種別毎の最大サイズは2016/02/24時点。これまでも何度か変更されている模様。

(*2) 2016/04/13の時点で確認した内容に修正(いつの時点で変更されたかは不明、過去の画像サイズはそのまま)。矩形に収めるようにではなく、横幅を基準に縮小されている?
(*3) 2016/06/05の時点で確認した内容に修正(いつの時点で変更されたかは不明、過去の画像サイズはそのまま)。再び、矩形に収めるように縮小されるようになった(戻った)?


また、試した範囲では、:orig を除く種別については、アップロードした画像の種別(PNG/JPEG)に関わらず、二種類(PNGおよびJPEG)の画像がそれぞれ作成される模様。
これはURL中の拡張子の部分を、pngにしたものjpgにしたものとをダウンロードして調べた。なお、拡張子をgifにしたものもダウンロードできるが、中身はPNG形式のものと同一の模様。

原寸画像(:orig)の画像種別について

:orig については、2016/02/24時点で、表示(ダウンロード)できるのは PNG もしくは JPEG のどちらかに限られる(それ以外は 404 not found となる)。
アップロードした画像の種別と、実際に表示(ダウンロード)出来る画像の関係は以下のようになっている。

アップロード種別 PNG(.png:orig)を表示 JPEG(.jpg:orig)を表示
JPEG ×
PNG(24bpp)PNG(透明ピクセル無し、もしくは約3MBを超えるもの?) ×
PNG(32bpp)PNG(透明ピクセル有り、かつ約3MB以下のもの?) ×

なお、種別に関わらず、Twitter側での画像変換は実施されるため、完全に元画像と同じものではない。

トピックス

原寸画像(:orig)の劣化を抑えるには?(アップロードの前に)

24bpp(アルファチャンネル無し)透明ピクセル無しのPNG画像はJPEGに変換されてしまうため、PNG形式のままで表示(ダウンロード)させたい場合は、32bpp(アルファチャンネル有り)に変換透明ピクセルを追加した後にアップロードするのが今のところ解決方法となる。
ただし、32bpp のPNG 画像が :orig を付けて原寸でダウンロードできた場合も、元画像そのものがダウンロードできるわけではなく、Twitter側で変換されたものになる(アップロードしたものとはファイルサイズ等が異なっている)。

既存の画像については、例えばPNG 32bpp変換 | しぇ庫を使って簡単に24bppから32bppへ変換できる(2016/02/27現在、Twitterの仕様変更により、透明ピクセル追加の対応検討中とのこと→2016/02/28に改訂版がリリースされた)。

原寸画像を表示・保存するためのブラウザ拡張機能/スクリプト

PC 用ブラウザで、Web 版 Twitter の原寸画像を表示したり、ダウンロードしたり出来る拡張機能/ユーザースクリプト等。
furyu.hatenablog.com
いちいち :orig をつけたり、ダウンロード時に拡張子を修正するのが面倒だったので、↓の二つを参考に、独自機能も付け加えて自作したもの。原寸表示・ダウンロード共に対応。Google Chrome、Opera、Firefox(Greasemonkey)に対応(ブックマークレットは一部機能を IE11 にも対応)
hogashi.hatenablog.com
chrome.google.com

試行錯誤など


スマートフォンで公式アプリを使った場合、最大横2048pxあたりまで(アプリ側で)縮められてしまうのかも…?


↑は元画像がJPEG・3264px×2448px(3.39MB)だが、:orig で見ても2048px×1536pxまで縮小させれてしまっている

【覚書】Chrome拡張機能にて、オプション画面の変更を即座に反映させたい場合

Google Chrome の拡張機能で、オプション画面で変更した内容を即座に反映させたい場合には、何らかの方法でオプション画面(options_page)からスクリプト(content_scripts)が動作しているタブ(tabs)に変更を通知してやる必要があるが、そのやり方の一例。

概要

タブ(tabs)上で動作している contents_script は、オプションが格納される(extension 用の) localStorage を直接参照することはできないため、オプションを取得するためにはbackground スクリプトを介在させる必要がある。

このため、典型的には、

  1. background は、あらかじめメッセージ待ち受け状態にしておく(chrome.runtime.onMessage.addListener())。
  2. contents_script がオプションを取得したいタイミングで、background へメッセージを送信(chrome.runtime.sendMessage())。
  3. background は、contents_script よりメッセージを受信すると、localStorage よりオプション値を読み出して適宜変換後*1、contents_script に返す。

のような作りとなる。

また、オプション画面(options_page)の典型的な作りは、

  1. 開いたタイミングで、localStorage よりオプション値を読み出し、ユーザーにわかりやすい形で表示。
  2. ユーザーの入力に応じて、localStorage にオプション値を書き出し。

のようになっている。

ここに新たに

  1. contents_script 側であらかじめメッセージを受け付けられる状態にしておく(chrome.runtime.onMessage.addListener())。
  2. options_page にて、localStorage にオプション値を書き出したタイミングで、contents_scriptの動作しているタブ(tabs)に対して、メッセージを送信(chrome.tabs.sendMessage())。
  3. contents_script は、options_page よりメッセージを受信すると、background よりオプションを取得する。

のような手順を追加してやることで、オプション画面からの変更が即座にタブ側(contents_script)もに反映されるようになる。
なお、options_page→contents_scriptへメッセージを送信するときに変更したオプション内容も一緒に送信してやれば、backgroundへのオプション問い合わせは省略できる。ただしその場合、options_page側でもオプション値の翻訳(ユーザーの入力値から、contents_scriptで用いる値への変換)を実装する必要があり、やや煩雑になる可能性がある。

サンプル

具体的な実装例は、

github.com

を参照のこと。

注意
  • タブに対するメッセージ送信のために、manifest.json に
    "permissions" : [ "tabs" ]
    の記述が必要。

経緯

GoogleChrome拡張機能「twitter画像原寸ボタン」ver. 2.0公開 - hogashi.*を入れていると、ときどき、Originalボタンが表示されなくなってしまう現象があり、調べていた
現時点の最新版である、2.0.4でも発生。

状況としては、

  • しばらく(一晩とか)放置しておいたタイムラインにて、新しいツイートを表示すると、[Original]ボタンが表示されなくなっていることがある。
  • 現象発生時、DOM ツリーに変化があるたびにコールされるようになっている関数(main.js 内の start())までは呼び出されているが、オプション設定を読み込むために発行したchrome.runtime.sendMessage()のコールバック関数が呼び出されていないように見える。
  • background.js 側のchrome.runtime.onMessage.addListener()で設定した関数も呼び出されていない(ただし、他タブでタイムラインを表示したところ、正しく呼び出される)。

ということで、sendMessage() コール後のメッセージ送受信処理のどこかで滞ってしまっている可能性が高い。

もし上記推測通りとすると、Chrome の不具合の可能性が高くなってくるため、ユーザー(拡張機能開発者)側で抜本的な対策を取るのは難しいかもしれない。

回避策としては、現状イベント発生(DOMツリー更新や[Enter]キー押下時)のたびにオプション取得(background.js とのメッセージ送受信)処理を実施しているのをやめ、なるべく頻度を減らす、という方向性はどうか?

  1. main.js が起動した直後の一回だけにする(結果として、オプション変更内容の反映はタブのリロード時に行われることとなるので、リアルタイムではなくなる)。
  2. 起動時とオプション画面からの変更時にのみ、実施する。

自作のスクリプト(原寸びゅー等)では手を抜いて基本、1. の方針にしているが、本来は 2. にすべきだろう……では、オプション変更時にどうやって各タブに通知すればよいのか?

という経緯と思考過程があって、記事にまとめてみた次第。

*1:localStorage には文字列しか格納できないため、contents_script が利用しやすい形(連想配列など)に変換してやる必要がある

【覚書】クロスドメインな画像を任意のファイル名でダウンロードするためのユーザースクリプトの記述方法

Twitter の原寸画像は、例えば「https://pbs.twimg.com/media/CYhLLnfU0AAbHun.jpg:orig」のようなURLとなっており、これを Windows のブラウザでダウンロードしようとすると、「CYhLLnfU0AAbHun.jpg-orig」のようなおかしな拡張子に変換されて保存されてしまうことがある*1

いちいち拡張子を修正するのが面倒だったため、
furyu.hatenablog.com
では、リンク(A)要素の download 属性で、ちゃんとした拡張子のファイル名(例えば、「CYhLLnfU0AAbHun-orig.jpg」)を指定してやり、リネームの手間を省こうとしたのだが……。
以前、
furyu.hatenablog.com
でも書いたように、クロスドメイン(クロスサイト)に於いては、download属性で指定したファイル名は無視されてしまう。

■例

<a href="https://pbs.twimg.com/media/CYhLLnfU0AAbHun.jpg:orig" download="<任意のファイル名>.jpg" id="download_link_sample_a">ダウンロードリンク-A</a>

これを何とかするための苦肉の策が以下のもの。
例によって、もっとスマートなやり方があればコメント願う。

ユーザースクリプトのサンプル

Cross-Domainなサイトの画像を任意のファイル名でダウンロードするユーザースクリプトのサンプル

このユーザースクリプトを Greasemonkey や Tampermonkey でインストールしてから、このページをリロードすると、↑の例のところに「ダウンロードリンク-B」というリンクが新たに表示されるはず。
これをクリックすると、「<任意のファイル名>.jpg」なるファイル名で画像がダウンロードできる……はず。
何をやっているかは、下記のソースコードを参照。また、このテスト以外には意味はないスクリプトなので、確認が終わったら削除しておくことを推奨。

// ==UserScript==
// @name            sample_download_link
// @namespace       http://furyu.hatenablog.com/
// @author          furyu
// @version         0.1.0.0
// @include         http://furyu.hatenablog.com/*
// @include         https://pbs.twimg.com/media/*
// @description     Cross-Domainなサイトの画像を任意のファイル名でダウンロードするユーザースクリプトのサンプル
// ==/UserScript==

( function () {

'use strict';

var SCRIPT_NAME = 'SAMPLE_DOWNLOAD_LINK',
    IFRAME_NAME = SCRIPT_NAME + '_download_frame',
    filename = '<任意のファイル名>.jpg',
    current_url = window.location.href;

if ( window !== window.parent ) {
    if ( window.name != IFRAME_NAME ) {
        return;
    }
    
    // 親 window から呼び出された画像用 IFRAME の処理
    var image_url = current_url,
        link = document.createElement( 'a' );
    
    link.href = image_url;
    link.download = filename;
    
    document.documentElement.appendChild( link );
    link.click(); // ダウンロード開始
    
    return;
}

// 親 window の処理

var source_image_link = document.querySelector( 'div#download_sample_image_container a#download_link_sample_a' );

if ( ! source_image_link ) {
    return;
}

var download_link = document.createElement( 'a' ),
    image_url = source_image_link.href;

download_link.href = image_url;
download_link.download = filename;
download_link.appendChild( document.createTextNode( 'ダウンロードリンク-B' ) );

download_link.addEventListener( 'click', function ( event ) {

    // リンクがクリックされたら、name を指定した隠し IFRAME を呼び出す
    
    event.stopPropagation();
    event.preventDefault();
    
    var iframe = document.createElement( 'iframe' ),
        iframe_style = iframe.style;
    
    iframe_style.width = '0';
    iframe_style.height = '0';
    iframe_style.visibility = 'hidden';
    
    iframe.src = image_url;
    iframe.name = IFRAME_NAME;
    
    document.documentElement.appendChild( iframe );
    
    return false;
}, false );

source_image_link.parentNode.appendChild( download_link );

} )()

注意

Google Chrome の拡張機能で上記の手法を使用するためには、manifest.json にて、

"content_scripts" : [
    {
        "matches" : [ "http://furyu.hatenablog.com/*", "https://pbs.twimg.com/media/*" ],
        "js" : [ "js/main.js" ],
        "run_at" : "document_end",
        "all_frames" : true
    }
]

のように、「 "all_frames" : true 」を指定して、IFRAME 内に対してもスクリプトが動作するように設定しておく必要がある。

*1:Firefoxだと、「CYhLLnfU0AAbHun.jpg orig.jpg」のようになるので、一応 JPEG としては解釈される

Google Chromeで、スクリプトが拡張機能として動作しているかどうかを判別するには?

furyu.hatenablog.com
等では、単体でユーザースクリプト(Greasemonkey/Tampermonkey)としても動作するスクリプトを、Google Chrome 拡張機能用として転用している。

このとき、

  • ユーザースクリプトとして動作する際には、スクリプト内で定義したデフォルト値を使用
  • 拡張機能として動作する際には、ユーザーが設定可能なオプション値を優先的に使用

という条件を満たさねばならず、そうすると、スクリプト自身が「今、自分はどちらとして動作しているか」を判別する必要が出てくる。

これをお手軽に知る方法はないか、検索をかけてみたのだけれど、探し方が悪いのか、なかなかしっくりくる方法が見つからない。
そこで、苦肉の策として以下のような方法を用いているのだが、もし読者の方でより簡便な方法をご存知の方がおられれば、ご教示願いたい。

1. manifest.json にて、初期化用スクリプトとメインスクリプトを、別々のタイミングで起動

"content_scripts" : [
    {
        "matches" : [ "https://twitter.com/*" ],
        "js" : [ "js/init.js" ],
        "run_at" : "document_start"
    },
    {
        "matches" : [ "https://twitter.com/*" ],
        "js" : [ "js/main.js" ],
        "run_at" : "document_end"
    }
],
"background" : {
    "scripts" : [ "js/background.js" ]
}

例の中の init.js が初期化用(document_start: DOM構築開始時に起動)で、main.js がユーザースクリプトを兼ねたメインスクリプト(document_end: DOM構築完了時に起動)。

なおバックグラウンドスクリプト(background.js)では、chrome.runtime.onMessage.addListener() で設定したリスナーにより、localStorageから取り出したユーザーオプション値を返す処理を定義しておく。

2. 初期化用スクリプト(init.js)内にて、ユーザーが設定したオプション値を取得する関数を定義

window.init_extension = function( callback ) {
    /* 任意の前処理 */
    chrome.runtime.sendMessage( {
        /* background.js で規定の処理を呼び出すためのパラメータ */
    }, function ( response ) {
        var user_options;
        /* response を解析して、ユーザーオプションを取得する処理 */
        callback( user_options );
    } );
};

background.js に対してchrome.runtime.sendMessage()にてメッセージを送信し、必要なユーザーオプションを取得した上で、コールバック関数に渡してやる関数を定義しておく。

3. メインスクリプト(main.js)内にて、2. の関数が定義されているかどうかで、処理を振り分け

if ( typeof window.init_extension == 'function' ) {
    // 拡張機能として動作
    window.init_extension( function( user_options ) {
        main( user_options ); // ユーザーオプションを設定
    } );
}
else {
    // ユーザースクリプトとして動作
    main(); // オプション未指定→デフォルト値を使用
}

2. で定義する関数が存在するかどうかにより、

  • 存在する場合: 拡張機能として動作しているとみなして当該関数を呼び出し、ユーザーオプションを取得して使用
  • 存在しない場合: ユーザースクリプトとして動作しているとみなし、デフォルト値を使用

Twitter 原寸びゅー:原寸画像を開く拡張機能&ユーザースクリプト(PC用Google Chrome・Firefox・Opera等対応)



Web 版公式 Twitter上で、ツイートの画像を原寸*1で表示したり保存することが出来るようになるスクリプトです。
バージョン 0.1.5 以降、TweetDeck にも対応。
Chrome 拡張機能版(Google Chrome/Opera/Vivaldi対応)、Firefox Quantum アドオン版と、ユーザースクリプト版(Firefox/Google Chrome/Microsoft Edge/Opera対応)とがあります。
Windows 7 Professional SP1 Windows 10 Pro 上にて動作確認2016/01/16→2016/05/22→2017/01/02時点ソースコードはGitHub上にて公開しています。
また、ブックマークレット版も用意しました。こちらは保存関係の機能は使えませんが、一応 Internet Explorer 11や Microsoft Edge でも動作します。


動作イメージ

www.youtube.com
デモは Chrome 拡張機能版 0.1.4.500 のものです。
オプションの表示と変更・コンテキストメニュー(右クリック)からの保存は、拡張機能版でのみ動作します。

インストール

Chrome 拡張機能版(Google Chrome/Opera対応)

chrome.google.com
より追加。
「Twitter 原寸びゅー」のページに表示されている [+ CHROME に追加] ボタンを押してインストールして下さい。
Operaの場合、あらかじめ
https://addons.opera.com/ja/extensions/details/download-chrome-extension-9/?display=enを導入しておけば、同様にインストール可能。

Firefox Quantum アドオン版(WebExtensions)

addons.mozilla.org

より追加。
ページ上に表示されている [+ Firefox へ追加] ボタンを押してインストールして下さい。

ユーザースクリプト(Greasemonkey / Tampermonkey)版(Firefox/Google Chrome/Edge/Opera対応)

Firefox+Gresemonkey、Google Chrome+Tampermonkey、Microsoft Edge+Tampermonkey、あるいは Opera+Tampermonkeyの環境で、

Twitter 原寸びゅー・ユーザースクリプト版(twOpenOriginalImage.user.js)

GitHub - furyutei/twOpenOriginalImage: Twitter 原寸びゅー

をクリックし、指示に従ってインストール。

必要であれば、

Twitter 画像ダウンロードヘルパー(twImageDownloadHelper.user)

GitHub - furyutei/twOpenOriginalImage: Twitter 原寸びゅー

も同様にインストール。
バージョン 0.1.3.0 以降、画像ダウンロードヘルパーの機能は原寸びゅーに吸収したため、画像ダウンロードヘルパーのインストールは必要なくなりました。

ブックマークレット版(IE11/Edge/Google Chrome/Firefox/Opera対応)

Twitter 原寸びゅー

Twitter 原寸びゅー - Hatena::Let

2016年6月現在、Microsoft Edgeだと、ブックマークレットを登録するのがかなり面倒みたいですね……参考:[Windows 10]Microsoft Edgeでブックマークレットを使う。 | 初心者備忘録

使い方

基本的な使用方法

インストール後には、Web 版公式 Twitter上で、画像を含むツイートに対し、[原寸画像]ボタンが追加されるようになります。
ブックマークレット版の場合は、Twitterのタイムラインが表示された状態で、実行(ブックマークレットをクリック)してください。

このボタン(もしくはサムネイル)をクリックすることで、原寸の画像(URLの後ろに「:orig」がついたもの)を開くことができます。
タイムライン上であれば、[j][k]キーで移動後、[v]キーを押すことで、当該のツイートの画像を開くこともできます*2
デフォルトでは、

  • クリック → ひとつのページにまとめて開く
  • [Alt]+クリック → 複数画像がある場合、各画像毎にページが開く(twitter原寸ボタン互換動作)

となります。
動作を逆にしたい場合、拡張機能版ではオプション設定で変更可能です。
ユーザースクリプト版の場合は、インストール後にソースコードの一部変更が必要になります(「■ パラメータ」のところにある、「DISPLAY_ALL_IN_ONE_PAGE : true」の、true を false に書き換えます)。

0.1.4.1 以降、「ひとつのページにまとめて開く」操作をすると、別タブではなく、タイムラインと同じタブ上に、原寸画像をオーバーレイ(ポップアップ)表示するようになりました。
従来通りにしたい場合、拡張機能版ではオプション設定のオーバーレイを無効にしてください。
ユーザースクリプト版の場合、ソースコードの「■ パラメータ」のところにある、「DISPLAY_OVERLAY : true」の、true を false に書き換えます。

画像ダウンロードヘルパーが有効な場合*3、[ダウンロード]リンクが付きます。これを押すと、当該画像がダウンロードできます。
この際、ダウンロードするファイル名は、URLが例えば「…….jpg:orig」の場合には、「……-orig.jpg」に変換するようにしています……これまで、ダウンロード後に手動で拡張子を修正するのがわずらわしかったので…。

また、オーバーレイ(ポップアップ)表示時に[z]キーを押すことで、表示されている画像をまとめてZIP化したものをダウンロードできます*4

Chrome 拡張機能版のみの機能

拡張機能版の場合、オプションでデフォルト動作やボタンのテキスト等を変更できます。

また、画像を右クリックしてコンテキストメニューを開くと、直接「原寸画像を保存」もできます*5
この場合も、ダウンロードされるファイル名の拡張子は「…….jpg-orig」→「……-orig.jpg」のように書き換わります。

注意書き(不具合と対処方法等)

Chrome 拡張機能版で無効化される場合

バージョン:0.1.2以降、Twitter 画像ダウンロードヘルパーの機能を追加したため、対象となるドメインが増えています。
以前は twitter.com のみだったものに、pbs.twimg.com を追加。

バージョン:0.1.5以降では、TweetDeck対応のため、tweetdeck.twitter.com も追加されています。

バージョン:0.1.8.301以降では、「閲覧履歴の読み取り」権限を追加しています。

名称で警戒されるかもしれませんが、実際にはタブを操作するための権限であり、オプション変更時にTwitter/TweetDeckの全タブをリロードするためのものです。本拡張機能では、閲覧履歴は利用していません。

このため、それより前のバージョンで使用していて自動アップデートされた場合など、要求される権限の変更により、一時的に Google Chrome 側で無効化されてしまう(ツールバーからアイコンが消える)ことがあるようです。

この場合も、拡張機能の画面 chrome://extensions/ (「≡」(右上のハンバーガーメニュー)→「その他のツール(L)」→「拡張機能(E)」)を開き、「Twitter 原寸びゅー」を探して、「□ 有効にする」のチェックボックスにチェックを入れることで、再度有効にすることができます。

また、ダイアログが表示された場合には、[再度有効にする]([権限の許可])ボタンを押してください。


Chromeのバージョンによって、表示される画面や文言などが変更になっていることがあります。

[ダウンロード]ボタンが同じ画像に二つ表示されてしまう

Twitter 画像ダウンロードヘルパー(twImageDownloadHelper.user)をインストールしていませんか?
インストールしている場合には、これを削除しておいてください。
バージョン:0.1.3.0以降、拡張機能版・ユーザースクリプト版共に、Twitter 画像ダウンロードヘルパー(twImageDownloadHelper.user)の機能は Twitter 原寸びゅー側に吸収されたため、このスクリプトは不要となりました。

[ダウンロード]ボタンを押すと、タブが閉じられてしまう

リンクの target 属性を無効化する(target="_blank"等となっていても構わずに同一のタブに表示する)ような設定や拡張機能を入れている場合に、[ダウンロード]ボタンを押すと、画像がダウンロードされるとともに、そのタブが閉じてしまうといった現象が発生するようです。

当方の環境では、Firefox 43.0.4 にて、Tab Mix Plus 0.4.2.0 を入れている場合に発生しました。
この場合には、アドオンの設定画面 about:addons(「≡」(右上のハンバーガーメニュー)→「アドオン」)で、
「拡張機能」→(Tab Mix Plusの)[設定]→「リンク」タブ→「☑ ファイルをダウンロードするときに空白タブが開かないようにする」
のチェックを外して[適用]してやれば、タブが閉じられる現象は発生しなくなりました。
その代わりに他の動作で不都合があるかもしれませんが……。

画像の保存場所をその都度選択したい

画像のダウンロード時に保存場所を尋ねてくるかどうかは、ブラウザの設定に従います。
例えば Google Chrome であれば、
「≡」(右上のハンバーガーメニュー)→「設定(S)」→「詳細設定を表示...」→「ダウンロード」
にて、
「☑ ダウンロード前に各ファイルの保存場所を確認する」
にチェックがついていれば、ダウンロード時に保存場所が確認されます。

Firefox で ZIP ダウンロード時に警告が出る

Firefoxでは、ZIPファイルをダウンロードすると、「このファイルを開くのは危険です」という警告が表示される場合があります(危険なファイルなんて含んでいないんですが……)。
今のところ、対処方法が見つかっておりません……悪しからず。
一応、about:preferences#privacy(「≡」→「オプション」→「プライバシーとセキュリティ」)→「セキュリティ」→「フィッシング防護」→「☑不要な危険ソフトウェアを警告する」のチェックを外すと警告は出なくなりますが、その分他のサイトで危険が増すのでお勧めはできません。

開発の経緯

Twitterの画像は、縮小やトリミングがされていたりサムネイル状態だったりで、見難いことも多いです。
画像のURLの後ろに「:orig」と付けてやれば原寸画像を開くことはできますが、いちいちやるのは面倒で……と思っていたら、便利な拡張機能が公開されていることを知りました。

hogashi 氏(id:hogashi/[twitter:@hogextend])の、
hogashi.hatenablog.com
というものです。

大変便利でしたが、ひとつのツイートに複数の画像がある場合には複数のタブが開いてしまい、ちょっとわずらわしかったため、とりあえずブックマークレット
let.hatelabo.jp
などを作ったりしている内に、興が乗ってしまい、いちから実装してしまった次第です。
なお、ひととおり作って満足してしまったため、今後の更新を行うかどうか怪しいです(汗)。不安な方は
twitter原寸ボタンの方をインストールすることをお勧めします。

*1:画像のURLに『:orig』もしくは『name=orig』がついているものを便宜上『原寸』としています。実際には縮小されている場合もあります

*2:2016/02/01・0.1.3.1以降

*3:拡張機能版は0.1.2.0以降・ユーザースクリプト版は0.1.3.0以降。なお、ブックマークレット版では、画像ダウンロードヘルパー機能は未サポート。

*4:0.1.7.1 以降

*5:2016/02/02・0.1.3.101以降