图像格式转换之 Jpeg2Jxr

为什么转?因为 JXR 格式在同等质量的情况下,存储空间比 JPEG 节约了 45-50%。

之前在《从 Windows 8 新功能推理某产品的八哥》提到过现在手机上的省流量 App,其原理就是压缩图片,但为了提高效果,这个压缩基本都是有损的,流量减少了,但是图片质量下降了,有的下降可以忍受,有的则令人发指!比如,长微博,文字转图片,这种图片线条分明,相邻像素值对比可能很大(黑白分明),这类图片采用高压缩比的 JPEG 压缩后,图片质量往往很差。

再举个例子:QR 码图片,您可以做一下试验,为了说明 JPEG 不适合存储线条型图片,哥采用一张蛋疼的 1290*1290 像素的 QR 码图片,保存为 JPEG 大小是 4.76MB,但保存为 PNG 格式时只有 52.4KB,请注意单位,前者是后者大小的将近 100 倍!!

大家可能比较少关注 WP,也许您没听过 DataSense,简单地说,它就是微软做的节省流量的 App。号称可以节约 45% 的流量,这么大的压缩率,除了优化 HTML 相关的文本之外,对图片的压缩肯定是必须的!推测 DataSense 可能使用了 JPEG XR 格式来转化其他格式的图片。

JPEG XR 虽然已经成为一种标准,但目前依然只有微软支持,所以,如果您想把这个技术应用到 iOS、Android 的节省流量 App 中,那很抱歉,此路暂时还不通。

根据实测,IE9@PC、IE10@PC、IE10@WP8 都是支持 JXR 格式的。下面是用 C++/CLI 写的很简单的一个格式转化程序:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
using namespace System;
using namespace System::IO;
using namespace System::Windows::Media;
using namespace System::Windows::Media::Imaging;

bool ConvertToJxr(System::String^ source_name)
{
//try {
Stream^ stream = gcnew FileStream(source_name, FileMode::Open, FileAccess::Read, FileShare::Read);
BitmapDecoder^ jpeg_decoder = BitmapDecoder::Create(stream, BitmapCreateOptions::PreservePixelFormat, BitmapCacheOption::None);
//JpegBitmapDecoder^ jpeg_decoder = gcnew JpegBitmapDecoder(gcnew Uri(source_name, UriKind::RelativeOrAbsolute), BitmapCreateOptions::PreservePixelFormat, BitmapCacheOption::None);
//Console::WriteLine(L"Author: `{0}'", jpeg_decoder->Metadata->Title);
FileStream^ jxr_file_stream = gcnew FileStream(source_name + L".jxr", FileMode::Create);
WmpBitmapEncoder^ jxr_encoder = gcnew WmpBitmapEncoder;
//BitmapMetadata^ metadata = gcnew BitmapMetadata(L"wmphoto");

for each (BitmapFrame ^ frame in jpeg_decoder->Frames) {
jxr_encoder->Frames->Add(BitmapFrame::Create(frame, jpeg_decoder->Thumbnail, (BitmapMetadata^)frame->Metadata, jpeg_decoder->ColorContexts));
}
//jxr_encoder->Metadata = metadata;
jxr_encoder->Save(jxr_file_stream);
//} catch (...) {
// return false;
//}
return true;
}

int main(array<System::String ^> ^args)
{
for each (auto arg in args) {
if (File::Exists(arg)) {
if (ConvertToJxr(arg)) {
Console::WriteLine(L"Converted: `{0}'", arg);
}
} else {
Console::WriteLine(L"NOT Exists: `{0}'", arg);
}
}
return 0;
}

文末是一些搜索到的关于 JPEG XR 的资料,可供参考:

http://jpeg.org/newsrel26.html

JPEG XR (ISO/IEC 29199-2) is now an International Standard and also an ITU-T Recommendation (T.832).

JPEG XR(旧称 HD Photo 及 Windows Media Photo)是一种连续色调静止图像压缩算法和文件格式,由Microsoft开发,属于Windows Media家族的一部分。它支持有损数据压缩以及无损数据压缩,并且是微软的XPS文档的首选图像格式。目前支持的软件包括.NET Framework(3.0 or newer),Windows Vista/Windows 7、Internet Explorer 9,Flashplayer 11等。

JPEG XR(微软HD Photo格式)2009 年,成为 ITU-T 推荐的国际标准(ISO/IEC 29199-2)。JPEG XR 的标准化确保数码相机、打印机、显示器和软件公司能够在开发其新产品的时候兼容互通。其核心技术由微软核心媒体开发团队开发完成,针对当前和将来的数字图像发展需求以提供了许多新的优势和特点。

在 Vista 操作系统中已经支持了这种新的文件格式,JPEG XR 相比其它技术更有优势,其中包括更好的压缩技术,以一半的文件大小保存与 JPEG 相同质量的图像,或以相同大小的文件保存质量相当于 JPEG 两倍的图像。JPEG 组织还对微软开放与 JPEG XR 相关的专利的决策表示了赞扬,称微软免许可费政策将有助于JPEG推动 JPEG XR 普及,有助于确保它能够被更多的用户所采用。JPEG 组织还鼓励其它公司向微软学习。

诗盗·一撸仙

《#诗盗#·一撸仙》:千里风随肩,足下拖鞋浅。遍看琵碧玺,花月一撸仙。

改编自霹雳角色“风雪一路禅”诗号。

千古佛随肩,
足下是福田,
遍看云山月,
风雪一路禅。

注解

穿着阿迪拖鞋暴走的时候,突然想到一路禅的诗号可以这么改~
这首诗综合了诗盗、霹雳、暴走、装逼、打嘴炮几大爱好,果然是集大成者。

从 Windows 8 新功能推理马头流量的八哥

Windows 8 确实是个不错的系统,DP、CP、RC、RTM,UMU 一路追过来。

在开始讲故事之前,要先介绍一下马头流量,http://www.matocloud.com/,同类产品:上网快鸟、飞速流量、瓦力流量、彩虹流量……当然,这些都是设设 APN 而已,马头的 Android 版本有更高深的技术。想了解更多,请研究一下 EnoVPN、VPN Service。

再来是流量压缩原理简介:主要是压缩图片。APN 就是一个 HTTP 代理,只不过这个代理有点不标准,会将原图压缩后交给用户,用户下载的是一张小图,自然就省流量。但这是有副作用的,有的图片必须是有损压缩才会变小,所以必然会降低图片质量。知道这个原理后,可能会有人会纠结了……至于您用不用,就看您在图片质量和流量之间的取舍了。

故事开始了!UMU 用 HTC Titan 拍过不少图片,当然其中不少是横屏拍的。这个手机有重力感应功能,拍的照片会带 Orientation 信息,这是 Exif 的一个字段,专业知识请另行搜索“Exif Orientation”。简单讲,无论您拍照时手机是横是竖,在手机看时,照片都会自动旋转,使景物是正立的。如果您没注意过,可以先在就做这个实验,把 iPhone 倒立拍照,正立过来看,景也会跟着自动转……

当 UMU 把图片同步到电脑上时,情况就不同了。Windows 7 自带的画图、图片查看器都不支持对 Orientation 自动校正,IE9、IE10、Chrome 22.0.1229.94 m、Paint.NET 也都不支持。所以,UMU 经常看到横屏拍的照片,在 Windows 7 上是歪 90 度显示的。

到 Windows 8 上,自带的画图、图片查看器都支持 Orientation 校正了!有一天,UMU 在看以前拍的图片时,突然发现,所有的图片都正立了……

蛋似,前面有提到 IE10 是不支持的,所以……UMU 特地上传了一张横拍的图片到腾讯微博上,果然这图就是歪 90 度的,缩略图和原图都是。然后再用 iPhone 看,缩略图是歪 90 度,这说明腾讯微博的缩略图也没考虑 Orientation 信息,点击查看原图,终于正立了,因为 iPhone 基本到处都支持 Orientation 自动旋转校正。

把这个发现,和马头流量结合起来思考——APN 服务器上的图片压缩程序会不会也没考虑 Orientation 信息?UMU 猜想是很有可能的,腾讯就没考虑到……然后开始测试!用 WiFi 看原图,是正立的,因为 WiFi 下,马头流量不会压缩图片;改用 3G,马头流量开始起作用,再去看原图,发生了两件事,大家应该猜到了——图片质量下降、图片歪了 90 度!八哥!这就是八哥啊!

诗盗·中秋槽

《#诗盗#·中秋槽》:今年博饼如去年,又如前年大前年。奖品还是没套套,别人撸锅哥撸个碗。

注解

公司的博饼年年都差不多,没什么改进……奖品都是些用不上的东西,连套套都没有,再加上哥运气不好,别人都能博到锅,哥只能撸个碗(个碗管)。

诗盗·悲剧项目

《#诗盗#·悲剧项目》:两个黄鹂鸣翠柳,一个项目上西天。眼含泪水兼吐血,门口贴着催款单。

改编自是唐代诗人杜甫的组诗《绝句》中的第三首《绝句·两个黄鹂鸣翠柳》。

两个黄鹂鸣翠柳,
一行白鹭上青天。
窗含西岭千秋雪,
门泊东吴万里船。

注解

一个项目上西天:快游大众版被枪毙,团队被解散。

诗盗·厦门焦通

《#诗盗#·厦门焦通》:厦门特区虽显赫,交通烂得逼一个。天上地下不给力,马路两边停满车。

注解

厦门的交通很烂是长久以来有目共睹的,一个小小的火车站,就有好多个站点,外地人刚来简直要被玩死……
天上:指 BRT,厦门的 BRT 大多数路段是在高架桥上的。
建设规划太过时,停车位太少,特别是软件园这种地方,有车的人特别多,车位基本是按照公交车来设定的,呵……这是上世纪 90 年代的设计了!

诗盗·最险中国疯

《#诗盗#·最险中国疯》:宣传口号十年坑,砖家年年显神能。最恨官式统计学,道降德衰中国疯。

注解

养老保险的口号几年一换,从养老靠政府到不能靠政府,十分坑爹……
这些专家每年都要跳出来讲点脑残言论,傻子都知道这其中是利益导致。
一提到人均收入,呵,见证奇迹的时刻来了,财产到底是多集中,一个个屁民都被平均了……
对这个神奇的国度,只想说:射精病!得治!