2010-09-25

日本放人并不等于中国赢

在中国总理温家宝参加纽约联合国会议,发出钓鱼岛风波以来 中国高层公开谴责日本的呼声,以及拒绝会见日相菅直人之后,日方态度突然转弯,日本那霸地方检察厅24日决定放还被其非法扣押的中国渔船船长詹其雄,放还 的理由是:"考虑到了对日本国民的影响以及今后的日中关系",不过,为了掩饰突然转弯的尴尬,那霸地方检察厅称,将以"保留处分"的形式放还詹其雄。

为何放人?很简单,中方政府的"间接施压"发生了直接效果,主要体现在:停止了人员交流,不顾损失展开了经贸"制裁",甚至于逮捕了"违法的日本公 民"等,这些举措导致日本国内"举国一致"的舆论发生了变化。但从国际舆论的角度来看,日本软化的最主要原因,在于事件激起了中国民众的极大愤怒,虽然两 岸三地的保钓活动在政府的约束之下,难以大规模展开,但海外华人全球规模的保钓活动已经风起云涌,这对日本产生的国际压力难以估计,更为严重的是,在美国 副总统拜登发言相挺日本,称中美关系必须经过东京之后,让北京猛醒,认识到要使钓鱼台风波解开死结,中国需走华盛顿的"门路",温家宝奥巴马会谈就是开 始,日本体认到,如果中国不计代价,与美国修好,让美国在钓鱼台风波上改变立场,那日本的"钓鱼台领土之说"便可能土崩瓦解,事实上,美国《纽约时报》专 栏作家罕见撰文,称从日本古地图来看,钓鱼岛就是中国领土,美国不会为几个荒岛,与中国展开核战争,这样的呼声,比中国外交部的照会更加管用,日本无法充 耳不闻。

问题是,日本宣布放人,是否就是中国的胜利?恐怕不是。

首先,宣布放人的是那霸地方检察厅,是原来准备"司法起诉"中国船长的单位,而非日本政府,这印证了日本政府的一贯主张,一切听从国内法的行事。不仅如此,从国际公关的角度来看,一个地方的司法机构,尚可考虑对日本国民的影响和中日关系大局,显示的是日本的司法文明。

第二,日本通过这次扣留,已经启动国内法,彰显钓鱼台主权,放人之际,也没有承认非法扣留,钓鱼台领土主权的争议,没有丝毫让步,唯一就是给了中国政府"最后的面子"。

第三,日本民主党通过此次风波,扭转了日美关系,转移了冲绳驻军问题上日本民众对民主党政府的压力,更为自卫队的扩军找到了充分理由。而民主党的 "明日之星"——外长前原诚司一举成名,宛如小泉时代的安倍晋三在对待朝鲜绑架日本人问题上持强硬姿态而获得后来成为首相的资本。

如果钓鱼岛风波就此落幕,中国沾沾自喜,以为打了大胜仗,随后回到常态,一方面压制民间保钓,一方面放任日本实际控制钓鱼岛管辖权,那么,这一场风 波的结果,中国还是输家。因为谁都知道,中国船长总会回来,"无条件释放"其实是一句空话,而钓鱼岛并没有回来。中国为了一个船长,大动干戈,而钓鱼岛领 土则视而不见,在某种程度上会增加国际社会认为"中国不理性"的印象,中国威胁论难以消除。

中国应该怎么办?

包机接回船长,这其实只是第一步,如果中国认为钓鱼岛是中国领土,船长是被非法扣押,那么,应该允许船长在中国法院打官司,控告日本非法扣押期间对 他和家人造成的损害,要求日本进行赔偿,中国的司法系统敢不敢接这个案子,考验中国对钓鱼台领土主权的决心和信心,同时,司法之战,也是国际社会喜闻乐见 的解决争端的最好的途径、最理性的途径,因而最符合普世价值。以一场司法战开启中国拿回钓鱼岛主权的契机,才可以让中国从"输"走向"赢",也让国际社会 感受中国"以法治国"的诚意,这叫以其人之道,还治其人之身。




全国最低价,天天在家冲照片,24小时发货上门!

2010-09-13

USB转并口的资料

德国人搞的,很强大
收藏先
http://www-user.tu-chemnitz.de/~heha/bastelecke/Rund%20um%20den%20PC/USB2LPT/index.html.en

USB2LPT – Cloning instructions for Release 1.6

This device is almost the same as Release 1.5.
For high-speed USB, there is a Release 1.7.

If 3.3V operation of ATmega is wanted, a user can now populate a dual diode BAV199 instead of the LD1117 of the previous version. This enables drawing less than 500 µA of standby current in this case.

Electronic Components

You need:

PiecesDescriptionReichelt Order CodePrice in € (2007)
1ATmega8 in TQFP32 packageATMEGA 8-16 TQ1.70
1Ceramic capacitor 100 nF 0603X7R-G0603 100n0.051
1Resistor array 220 Ω 1206BCN16 0.02
1Resistor 10 kΩ 0805SMD-0805 10k0.10
1Electrolytic capacitor 10 µFrad 10/350.041
1Yellow LED 3 mm LED 3mm ST ge0.051
1SubD receptacle 25 pinD-SUB BU 250.15
1USB receptacle MiniB through-holeUSB BWM0.50
1HousingKappe CG25G0.13
1USB cable 1 mAK 673-A0.98
1Two-sided PCB (see below)UL16LP1.00

It's not hard to populate this PCB.

Photo upper side   Photo lower side
(Sufficiently) populated PCB

The LED

The yellow multi-function LED shows following states:
  • off:
    • No power supply (cable broken or similar)
    • USB2LPT not recognized by computer
    • USB Standby mode - e.g. at notebook's suspend mode
    • USB2LPT in bootloader mode
  • on:
    • USB2LPT active, output drivers enabled, inputs with pull-up resistors
  • flashing:
    • fast: USB BULK or INTERRUPT transfers (redirected IN and OUT instructions; normal operation)
    • slow: USB CONTROL transfers (mostly initiated by Windows)

Software

Preparations

  • Drill holes into SubD shell for LED
  • Label the shell
  • Bend pins of USB receptacle straight – see picture
  • Trim pins of LED and electrolytic capacitor to about 1 cm length
  • Download and install either  extern PonyProg2000 or extern WinAVR
  • PonyProg2000: Setup interface as shown here, check by connecting the programming adapter (this checks for connection between Pin 2 and Pin 12), invoke Setup→Calibration

Making-Of

  • put SMD cream, 4 SMD components, make a reflow process – or solder by hand
  • Check for short circuit between 5 volts and ground
  • press and solder SubD receptacle keeping ½ mm gap between PCB and SubD shroud
  • Align and solder USB receptacle (see helper tool), solder the pins with lowest possible iron temperature
  • Populate electrolytic capacitor as flat as possible
  • Align and solder the LED using the shell, watch for right polarity
  • Check for short circuit between 5 volts and ground again
  • Check "operation" by connecting the USB cable, must show as "inoperational USB device", this is the power supply for programming the bootloader
  • Connect programming adapter to an old-style parallel port and program the bootloader, either
    • PonyProg2000: load main.hex, write, set fuses exactly as shown here
      Do not twiddle with the fuses without knowledge! You may make the ATmega unaccessible to PonyProg2000 and all other low-voltage serial programmers!
      or
    • WinAVR: invoke make prog (directory src/firmware/USB2LPT6/bootloadHID)
    If your programming software doesn't recognize the right controller, check:
    • Programming adapter soldered correctly?
    • Programming adapter used in correct direction?
    • Solder jumper SJ2 (still) connected?
    • Pins of SubD25 socket soldered correctly?
    • Microcontroller soldered in correct alignment and angle? (If wrong, remove with a hot-air gun. If 180° wrong, use new ATmega8.)
    • Mikrocontroller soldered without shorts?
  • Cycle power to USB2LPT, let install driver usb2lpt.inf. The Bootloader ( [extern] HIDboot) will not occur bevause the .hex file above contains both bootloader and the real USB2LPT firmware.
    If there is no USB2LPT, then check:
    • Solder joints on USB socket correctly?
    • USB socket not melted? (Contact springs still visible?)
    • SMD solder joints correctly without shorts?
    Check with another computer and/or with front-side or back-side USB connectors on PC, or using a USB hub. If USB2LPT seems to work unreliable, populating the crystal and downgrading to USB2LPT 1.5 firmware may help. The reason is an unstable 5V supply, that jitters the internal RC oscillator of the 1.6 firmware solution.
  • Remove programming adapter
  • Scratch jumper SJ2 (the only solder jumper on silk-screen-less lower PCB side)
  • Connect LPT checker or similar device, run Kurzschlusstest.exe, make corrections if necessary
  • Close shell, make a final check

Known PCB bugs

  • The crystal and the both 22 pF capacitors are not to populate
  • Population with ATmegaX8 is currently not recommended.
    If you want ATmega48 population, R1 should be 4.7 kΩ, and the older firmware USB2LPT5 (and crystal) must be used. A bootloader cannot be used (this chip has no bootloader support)
  • If D2 (BAV199) is used, R1 must be 1.5 kΩ

Solder jumpers

This revision 6 (USB2LPT 1.6) has 3 pre-connected solder jumpers:
    SJ1 can assign power to pin 25 of SubD receptacle:
  • open: Pin 25 unbeschaltet
  • right connected: Pin 25 to ground (default)
  • left connected: Pin 25 to 5 volts
If power is needed, populating a self-resetting fuse is highly recommended.
  • SJ2, connected at PCB fabrication, scratched at device manufacturing: activates the RESET pin of ATmega for programming the microcontroller.

  • SJ3, connected by default, scratch when you want 3.3 volts operation of ATmega8 (e.g. for safer JTAG connection), populate a BAV199 and change R1. Moreover, scatch it to measure device's current consumption and re-solder.

USB2LPT – Cloning instructions for Release 1.7

Electronic Components

Almost identical to Release 1.4. Except voltage regulator:

insteadnowGND currentoutput currentoptionsattention
LD1117S33TPS79733DCK1,3 µA 50 mA (190 mA typ.)PowerGood outputPopulate C4
TPS71533DCK3,2 µA 50 mA (125 mA min.)
TPS71433DCK 80 mA (100 mA min.)
TPS77033DBV17 µA 50 mA (340 mA typ.)inverse enable input
(not used here)
Do not populate C4!
Instead, populate electrolytic or tantalum capacitor 10 µF into two holes beneath C4.
This is because ESR must have a minimum for stable operation.
TPS78833DBV150 mA (350 mA typ.)
TPS76933DBV18 µA100 mA (350 mA typ.)
Values in parentheses are for internal current limitation

The overall current consumption of this device in USB idle state should now be about 500 µA, as required by USB specification.
(The EZUSB-FX2 chip itself contributes 500 µA:-)

Inside DeviceInside Device
Populated PCB. The capacitor C4 is exceptionally populated with an SMD tantalum capacitor

Software

Solder Jumper

Same as for Revision 1.4.


全国最低价,天天在家冲照片,24小时发货上门!

2010-09-11

Show下新买的2504底座

在淘宝上淘来的, 比较新,也比较便宜 hoho 算邮费一共 188

下面来开箱照,不过是回家补上的

店家比较负责,包装不错,外面贴着 易碎物品的提示

包了很多珍珠纸

见到庐山真面目了,看到是thinkpad logo, 现在越看thinkpad logo 越觉得比三色标好看

背面,有些地方有点划痕,不太明显,这么低的价格,还带钥匙,这点瑕疵能够接受。

正面照,看起来很新 hoho

正面照,看起来很新 hoho

使用中

测试了接口,USB,并口,视频输出,音频,网口都可以用,串口和电话口没试,基本用不到。我主要用并口,使用编程器

原来看见过有人转让2504底座,说不支持在线编程。

我查了下,底座都是原生并口,串口。本来想买个PC卡转并口的,查了下都要150 左右,有些更贵。就冒险买了这个底座,还好能用 hoho




您想拥有和网易免费邮箱一样强大的软件吗?

2010-07-30

yuv和yCbCr的差异

一、和rgb之间换算公式的差异

yuv<-->rgb

Y'= 0.299*R' + 0.587*G' + 0.114*B'

U'= -0.147*R' - 0.289*G' + 0.436*B' = 0.492*(B'- Y')

V'= 0.615*R' - 0.515*G' - 0.100*B' = 0.877*(R'- Y')

R' = Y' + 1.140*V'

G' = Y' - 0.394*U' - 0.581*V'

B' = Y' + 2.032*U'

yCbCr<-->rgb

Y' = 0.257*R' + 0.504*G' + 0.098*B' + 16

Cb' = -0.148*R' - 0.291*G' + 0.439*B' + 128

Cr' = 0.439*R' - 0.368*G' - 0.071*B' + 128

R' = 1.164*(Y'-16) + 1.596*(Cr'-128)

G' = 1.164*(Y'-16) - 0.813*(Cr'-128) - 0.392*(Cb'-128)

B' = 1.164*(Y'-16) + 2.017*(Cb'-128)

Note: 上面各个符号都带了一撇,表示该符号在原值基础上进行了gamma correction

 

二、来源上的差异

yuv色彩模型来源于rgb模型,

该模型的特点是将亮度和色度分离开,从而适合于图像处理领域。

应用:basic color model used in analogue color TV broadcasting.

 

YCbCr模型来源于yuv模型。YCbCr is a scaled and offset version of the YUV color space.

应用:数字视频,ITU-R BT.601 recommendation

 

ps:

通过上面的比较可以确定,我们在h.264,mpeg等编码标准中用的yuv其实是YcbCr,大家不要被名称搞混淆了。




网易邮箱,没有垃圾邮件的邮箱。

2010-07-29

转:刷坏BIOS不要急,盲刷方法实测有效(T400,X200)但是有局限性

因为工作之便,最近在3台机器上尝试了 BIOS盲刷拯救法,
其中2台成功,1台失败
因为只有3台,所以总结的经验不一定对
个人总结出的 盲刷成功率 的局限性:
开机几个灯闪一下就没反应的,可能无效
开机一长两短报警的,比较有戏

但是个人感觉死马当活马医,这个方法是值得尝试的。

详细说下这3台机器,2台成功的一台是X200一台T400,都是开机一长两短报警,失败的一台X200是开机几个灯一闪就没反应的。这3台机器其中2台是客户刷新bios后,机器重启过程中强制关机的,其中一台是windows下刷新bios程序假死客户直接关电的。

T61等老机器我没测试过。T410等新机器也没测试过。

具体盲刷方法如下:
1,下载一个叫做 wincris 的工具,并解压缩到比如 D:wincris 目录下,这是 Phoenix 公司提供的应急启动盘工具,Google一下就有
2,找到你机器对应的BIOS的ROM文件,改名为 BIOS.WPH文件备用, 个人建议准备2-3个版本备用,一个不成功可以换另一个:
a,一个是你刷错之前的版本,这个可以把硬盘拆下来,找到c:driversflashxxxx 下面有个bios.bak的文件(这是你之前windows 下刷新时,刷新软件自动备份的文件)改名为 BIOS.WPH 文件备用
b,一个是你刷的新版本的,如果你刷的本来就是.rom的文件(破解版啊加白名单版啊,无所谓),直接把它改名 BIOS.WPH 文件备用
c,如果你本来是刷官方bios挂掉的,官方bios内不会有新版rom文件,所以你就去bios之家找你对应机型的下一个吧。把rom文件改名为 BIOS.WPH 文件备用
注意!这个WPH文件格外重要,千万不要搞错型号
另注意正常T400的这个文件都是8M,X200 BIOS ID 6D开头的是8M,7X开始的是4M的版本,注意不要搞错
3,找一台XP的机器(Vista或Win7都不行)
4,找一个2G以内的U盘,我是用1G的成功的。(最好有读写指示灯)(大于2G不能格为Fat)
5,运行 wincris,选择U盘盘符,点start
6,弹出对话框问你盘会格式化掉是否继续,选是。
7,若干秒后,弹出对话框说做好了,是否需要再做一个,选否。
8,打开U盘,发现里面有 minidos.sys 和 PHLASH16.exe 2个文件
9,将前面准备的 BIOS.WPH 文件拷贝到U盘,先用老版本的好了。
10,记得弹出优盘再拔出,避免文件没写入完成。


应急BIOS恢复U盘准备好了,我们就开始盲刷。

1,取下笔记本电池,拔掉电源
2,插上优盘,按住Fn+Esc 按住不放
3,另一只手插上电源,按开关键,Fn+Esc 始终按住不放
4,如果一切正常,会发现 U盘狂闪,机器发出短促的 beep声(持续)
5,30秒后,一声清脆长 beep 声 后U盘停止闪动,这表示bios文件已经全部读到内存,开始刷新。这时候Fn+Esc 可以松了,但是不要千万不要关机,让他继续
6,大概再过30秒,机器会自动关机。
7,拔掉U盘,开机,如果一切正常,你会看到久违的 ThinkPad开机logo,然后就进bios恢复默认设置什么就好。
8,如果需要,还可以去刷回正常你需要的BIOS版本(前面用的WPH文件如果不是你所需版本的话)

容易出错和不成功的部分
1,优盘,我换了3个才成功,首先大于2G肯定不行,太老的可能不行,如果盲刷过程第4步发现U盘压根就不读取,先重做优盘。
2,WPH文件,一个不行,换一个试试。

转自网络




网易邮箱,没有垃圾邮件的邮箱。

2010-07-16

快来测测你的电脑是男的还是女的?


你的电脑是男的还是女的?

让电脑替你说I IOVE YOU(原来电脑是有性别的...):
①新建一个记事本文件
②在里面输入 CreateObject("SAPI.SpVoice").Speak "I love YOU"
③保存扩展名为 .VBS 文件 如:我爱你.vbs
④带上耳机,双击运行,电脑就会说 i love you 了。你听到的是男声还是女生呢?当然你也可以换其他英文。 还可以写中文,就是把I LOVE YOU 换成别的汉字也可以.
看看你的电脑是男的还是女的?




您想拥有和网易免费邮箱一样强大的软件吗?

2010-07-13

JPEG 解码过程简述

解码过程简述
-------------
8. 一个数据单元 Y 的解码 (其余类同)
--------------------------------
在整个图片解码的开始, 你需要先初始化 DC 值为 0.
1) 先解码 DC:
         a) 取得一个 Huffman 码 (使用 Huffman DC 表)
         b) Huffman解码, 看看后面的数据位数 N
         c) 取得 N 位, 计算 Diff 值
         d) DC + = Diff
         e) 写入 DC 值:      " vector[0]=DC "
2) 解码 63 个 AC:
------- 循环处理每个 AC 直到 EOB 或者处理到 64 个 AC
       a) 取得一个 Huffman 码 (使用 Huffman AC 表)
       b) Huffman 解码, 得到 (前面 0 数量, 组号)
[记住: 如果是(0,0) 就是 EOB 了]
       c) 取得 N 位(组号) 计算 AC
       d) 写入相应数量的 0
       e) 接下来写入 AC
-----------------
下一步的解码
------------
上一步我们得到了 64 个矢量. 下面我们还需要做一些解码工作:
1) 反量化 64 个矢量 : "for (i=0;i<=63;i++) vector*=quant" (注意防止溢出)
2) 重排列 64 个矢量到 8x8 的块中
3) 对 8x8 的块作 IDCT
对 8x8 块的 (Y,Cb,Cr) 重复上面的操作 [Huffman 解码, 步骤 1), 2), 3)]
4) 将所有的 8bit 数加上 128
5) 转换 YCbCr 到 RGB
9. JPG 文件(Byte 级)里怎样组织图片信息
-----------------------------------
注意 JPEG/JFIF 文件格式使用 Motorola 格式, 而不是 Intel 格式, 就是说, 如果
是一个字的话, 高字节在前, 低字节在后.
JPG 文件是由一个个段 (segments) 构成的. 每个段长度 <=65535. 每个段从一个标
记字开始. 标记字都是 0xff 打头的, 以非 0 字节和 0xFF 结束. 例如 'FFDA' ,
'FFC4', 'FFC0'. 每个标记有它特定意义, 这是由第2字节指明的. 例如, SOS (Start
Of Scan = 'FFDA') 指明了你应该开始解码. 另一个标记 DQT (Define Quantization
Table = 0xFFDB) 就是说它后面有 64 字节的 quantization 表
在处理 JPG 文件时, 如果你碰到一个 0xFF, 而它后面的字节不是 0, 并且这个字节
没有意义. 那么你遇到的 0xFF 字节必须被忽略. (一些 JPG 里, 常用用 0xFF 做某
些填充用途) 如果你在做 huffman 编码时碰巧产生了一个 0xFF, 那么就用 0xFF
0x00 代替. 就是说在 jpeg 图形解码时碰到 FF00 就把它当作 FF 处理.
另外在 huffman 编码区域结束时, 碰到几个 bit 没有用的时候, 应该用 1 去填充.
然后后面跟 FF.
下面是几个重要的标记
--------------------
SOI = Start Of Image = 'FFD8'
这个标记只在文件开始出现一次
EOI = End Of Image = 'FFD9'
JPG 文件都以 FFD9 结束
RSTi = FFDi ( i =  0..7)  [ RST0 = FFD0, RST7=FFD7]
     = 复位标记
通常穿插在数据流里, 我想是担心 JPG 解码出问题吧(应该配合 DRI 使用). RST 将
Huffman 的解码数据流复位. DC 也重新从 0 开始计
(SOS --- RST0 --- RST1 -- RST2 --...
...-- RST6 --- RST7 -- RST0 --...)
-------
10. 标记
-------
下面是必须处理的标记
SOF0 = Start Of Frame 0 = FFC0
SOS  = Start Of Scan    = FFDA
APP0 = it's the marker used to identify a JPG file which uses the JFIF
    specification       = FFE0
COM  = Comment          = FFFE
DNL  = Define Number of Lines    = FFDC
DRI  = Define Restart Interval   = FFDD
DQT  = Define Quantization Table = FFDB
DHT  = Define Huffman Table      = FFC4
11. JPG 文件中 Haffman 表的储存
-----------------------------
JPEG 里定义了一张表来描述 Haffman 树. 定义在 DHT 标记后面. 注意: Haffman
代码的长度限制在 16bit 内.
一般一个 JPG 文件里会有 2 类 Haffman 表: 一个用于 DC 一个用于 AC (实际有 4
个表, 亮度的 DC,AC 两个, 色度的 DC,AC 两个)
这张表是这样保存的:
1) 16 字节:
第 i 字节表示了 i 位长的 Huffman 代码的个数 (i= 1 到 16)
                                        
2) 这表的长度 (字节数) = 这 16 个数字之和
现在你可以想象这张表怎么存放的吧? 对应字节就是对应 Haffman 代码等价数字. 我
不多解释, 这需要你先了解 Canonical Huffman Code. 这里只举一个例子:
Haffman 表的表头是 0,2,3,1,1,1,0,1,0,0,0,0,0,0,0,0
就是说长度为 1 的代码没有
长度为 2 的代码为 00
                 01
长度为 3 的代码是 100
                 101
                 110
长度为 4 的代码是 1110
长度为 5 的代码是 11110
长度为 6 的代码是 111110
长度为 7 的代码没有 (如果有一个的话应该是 1111110)
长度为 8 的代码是 11111100
         .....
后面都没有了.
如果表下面的数据是
    45 57 29 17 23 25 34 28
就是说
    45 = 00
    57 = 01
    29 = 100
    17 = 101
    23 = 110
等等...
使用 Canonical Huffman Code 的好处在于可以很简洁的重建对应关系表.
12. 采样系数
-----------
下面讲解的都是真彩 JPG 的解码, 灰度 JPG 的解码很简单, 因为图形中只有亮度信
息. 而彩色图形由 (Y, Cr, Cb) 构成, 前面提到过, Y 通常是每点采样一次, 而 Cr,
Cb 一般是 2x2 点采样一次, 当然也有的 JPG 是逐点采样, 或者每两点采样 (横向
两点, 纵向一点) 采样系数均被定义成对比最高采样系数的相对值.
一般情况 (即: Y 逐点采样, Cr Cb 每 2x2 点一次) 下: Y 有最高的采样率, 横向采
样系数HY=2 纵向采样系数 VY=2; Cb 的横向采样系数 HCb=1, 纵向采样系数 VCb=1;
同样 HCr=1, VCr=1
在 Jpeg 里, 8x8 个原始数据, 经过 RLE, Huffman 编码后的一串数据流称为一个
Data Unit (DU) JPG 里按 DU 为单位的编码次序如下:
     1)      for  (counter_y=1;counter_y<=VY;counter_y++)
                  for (counter_x=1;counter_x<=HY;counter_x++)
                     {  对 Y 的 Data Unit 编码 }
     2)      for  (counter_y=1;counter_y<=VCb ;counter_y++)
                  for (counter_x=1;counter_x<=HCb;counter_x++)
                     {  对 Cb 的 Data Unit 编码 }
     3)      for  (counter_y=1;counter_y<=VCr;counter_y++)
                  for (counter_x=1;counter_x<=HCr;counter_x++)
                     {  对 Cr 的 Data Unit 编码 }
按我上面的例子: (HY=2, VY=2 ; HCb=VCb =1, HCr,VCr=1) 就是这样一个次序
    YDU,YDU,YDU,YDU,CbDU,CrDU
这些就描述了一块 16x16 的图形. 16x16 = (Hmax*8 x Vmax*8) 这里 Hmax=HY=2
Vmax=VY=2
一个 (Hmax*8,Vmax*8) 的块被称作 MCU (Minimun Coded Unix) 前面例子中一个
MCU = YDU,YDU,YDU,YDU,CbDU,CrDU
如果  HY =1, VY=1
      HCb=1, VCb=1
      HCr=1, VCr=1
这样 (Hmax=1,Vmax=1), MCU 只有 8x8 大, MCU = YDU,CbDU,CrDU
对于灰度 JPG, MCU 只有一个 DU (MCU = YDU)
JPG 文件里, 图象的每个组成部分的采样系数定义在 SOF0 (FFC0) 标记后
13. 简单说一下 JPG 文件的解码
-------------------------
解码程序先从 JPG 文件中读出采样系数, 这样就知道了 MCU 的大小, 算出整个图象
有几个 MCU. 解码程序再循环逐个对 MCU 解码, 一直到检查到 EOI 标记. 对于每个
MCU, 按正规的次序解出每个 DU, 然后组合, 转换成 (R,G,B) 就 OK 了
附:JPEG 文件格式
~~~~~~~~~~~~~~~~
  - 文件头 (2 bytes):  $ff, $d8 (SOI) (JPEG 文件标识)
  - 任意数量的段 , 见后面
  - 文件结束 (2 bytes): $ff, $d9 (EOI)
段的格式:
~~~~~~~~~
  - header (4 bytes):
       $ff     段标识
        n      段的类型 (1 byte)
       sh, sl  该段长度, 包括这两个字节, 但是不包括前面的 $ff 和 n.
               注意: 长度不是 intel 次序, 而是 Motorola 的, 高字节在前,
        低字节在后!
  - 该段的内容, 最多 65533 字节
注意:
  - 有一些无参数的段 (下面那些前面注明星号的)
    这些段没有长度描述 (而且没有内容), 只有 $ff 和类型字节.
  - 段之间无论有多少 $ff 都是合法的, 必须被忽略掉.
段的类型:
~~~~~~~~~
   *TEM   = $01   可以忽略掉
    SOF0  = $c0   帧开始 (baseline JPEG), 细节附后
    SOF1  = $c1   dito
    SOF2  = $c2   通常不支持
    SOF3  = $c3   通常不支持
    SOF5  = $c5   通常不支持
    SOF6  = $c6   通常不支持
    SOF7  = $c7   通常不支持
    SOF9  = $c9   arithmetic 编码(Huffman 的一种扩展算法), 通常不支持
    SOF10 = $ca   通常不支持
    SOF11 = $cb   通常不支持
    SOF13 = $cd   通常不支持
    SOF14 = $ce   通常不支持
    SOF14 = $ce   通常不支持
    SOF15 = $cf   通常不支持
    DHT   = $c4   定义 Huffman Table,  细节附后
    JPG   = $c8   未定义/保留 (引起解码错误)
    DAC   = $cc   定义 Arithmetic Table, 通常不支持
   *RST0  = $d0   RSTn 用于 resync, 通常被忽略
   *RST1  = $d1
   *RST2  = $d2
   *RST3  = $d3
   *RST4  = $d4
   *RST5  = $d5
   *RST6  = $d6
   *RST7  = $d7
    SOI   = $d8   图片开始
    EOI   = $d9   图片结束
    SOS   = $da   扫描行开始, 细节附后
    DQT   = $db   定义 Quantization Table, 细节附后
    DNL   = $dc   通常不支持, 忽略
    DRI   = $dd   定义重新开始间隔, 细节附后
    DHP   = $de   忽略 (跳过)
    EXP   = $df   忽略 (跳过)
    APP0  = $e0   JFIF APP0 segment marker (细节略)
    APP15 = $ef   忽略
    JPG0  = $f0   忽略 (跳过)
    JPG13 = $fd   忽略 (跳过)
    COM   = $fe   注释, 细节附后
其它的段类型都保留必须跳过
SOF0: Start Of Frame 0:
~~~~~~~~~~~~~~~~~~~~~~~
  - $ff, $c0 (SOF0)
  - 长度 (高字节, 低字节), 8+components*3
  - 数据精度 (1 byte) 每个样本位数, 通常是 8 (大多数软件不支持 12 和 16)
  - 图片高度 (高字节, 低字节), 如果不支持 DNL 就必须 >0
  - 图片宽度 (高字节, 低字节), 如果不支持 DNL 就必须 >0
  - components 数量(1 byte), 灰度图是 1, YCbCr/YIQ 彩色图是 3, CMYK 彩色图
    是 4
  - 每个 component: 3 bytes
     - component id (1 = Y, 2 = Cb, 3 = Cr, 4 = I, 5 = Q)
     - 采样系数 (bit 0-3 vert., 4-7 hor.)
     - quantization table 号
DRI: Define Restart Interval:
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  - $ff, $dd (DRI)
  - 长度 (高字节, 低字节), 必须是 4
  - MCU 块的单元中的重新开始间隔 (高字节, 低字节),
    意思是说, 每 n 个 MCU 块就有一个 RSTn 标记.
    第一个标记是 RST0, 然后是 RST1 等, RST7 后再从 RST0 重复
DQT: Define Quantization Table:
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  - $ff, $db (DQT)
  - 长度 (高字节, 低字节)
  - QT 信息 (1 byte):
     bit 0..3: QT 号(0..3, 否则错误)
     bit 4..7: QT 精度, 0 = 8 bit, 否则 16 bit
  - n 字节的 QT, n = 64*(精度+1)
备注:
  - 一个单独的 DQT 段可以包含多个 QT, 每个都有自己的信息字节
  - 当精度=1 (16 bit), 每个字都是高位在前低位在后
DAC: Define Arithmetic Table:
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
法律原因, 现在的软件不支持 arithmetic 编码.
不能生产使用 arithmetic 编码的 JPEG 文件
DHT: Define Huffman Table:
~~~~~~~~~~~~~~~~~~~~~~~~~~
  - $ff, $c4 (DHT)
  - 长度 (高字节, 低字节)
  - HT 信息 (1 byte):
     bit 0..3: HT 号 (0..3, 否则错误)
     bit 4   : HT 类型, 0 = DC table, 1 = AC table
     bit 5..7: 必须是 0
  - 16 bytes: 长度是 1..16 代码的符号数. 这 16 个数的和应该 <=256
  - n bytes: 一个包含了按递增次序代码长度排列的符号表
    (n = 代码总数)
备注:
  - 一个单独的 DHT 段可以包含多个 HT, 每个都有自己的信息字节
COM: 注释:
~~~~~~~~~~
  - $ff, $fe (COM)
  - 注释长度 (高字节, 低字节) = L+2
  - 注释为长度为 L 的字符流
SOS: Start Of Scan:
~~~~~~~~~~~~~~~~~~~
  - $ff, $da (SOS)
  - 长度 (高字节, 低字节), 必须是 6+2*(扫描行内组件的数量)
  - 扫描行内组件的数量 (1 byte), 必须 >= 1 , <=4 (否则是错的) 通常是 3
  - 每个组件: 2 bytes
     - component id (1 = Y, 2 = Cb, 3 = Cr, 4 = I, 5 = Q), 见 SOF0
     - 使用的 Huffman 表:
- bit 0..3: AC table (0..3)
- bit 4..7: DC table (0..3)
  - 忽略 3 bytes (???)
备注:
  - 图片数据 (一个个扫描行) 紧接着 SOS 段.


中文调查网
第一调查网清研网
聚宝箱 积沙成塔 乐调网 ePanel益派调查网