我现在正在作解析PSD文件的工程,有没有人有兴趣

影子传说_Hades 2010-05-13 09:25:18
资料来源GIMP2.6源代码,目前进度比较缓慢,我打算做成纯JAVA的
大家有没有人对这个有兴趣

---------------------------------------------------------------------------------------read_header_block color_mode_block

一条记录的长度为4,读1个单位,放入sig数据结构中,该标志表明是不是PS文件,应该为"8BPS"
fread (sig, 4, 1, f)

一条记录的长度为2,读1个单位,放入version数据结构中
fread (&version, 2, 1, f)

fread (buf, 6, 1, f)

fread (&img_a->channels, 2, 1, f)

fread (&img_a->rows, 4, 1, f)

fread (&img_a->columns, 4, 1, f)

fread (&img_a->bps, 2, 1, f)

fread (&img_a->color_mode, 2, 1, f)

长度 偏移量 说明
4字节 0-3 应该为"8BPS"
2字节 4-5 version 必须为1
6字节 6-11 buf
2字节 12-13 channels
4字节 14-17 rows
4字节 18-21 columns
2字节 22-23 bps
2字节 24-25 color_mode 只能为 PSD_BITMAP PSD_GRAYSCALE PSD_INDEXED PSD_RGB PSD_DUOTONE




---------------------------------------------------------------------------------------read_color_mode_block
img_a->color_mode已经有值了


fread (&block_len, 4, 1, f)
block_len = GUINT32_FROM_BE (block_len);

1、如果block_len == 0
1.1、如果block_len == 0
并且img_a->color_mode == PSD_INDEXED或者img_a->color_mode == PSD_DUOTONE
报错 No color block for indexed or duotone image

2、如果block_len != 0 并且 img_a->color_mode == PSD_INDEXED
2.1、如果block_len != 768
报错 Invalid color block size for indexed image
2.2、如果block_len == 768
img_a->color_map_len=block_len;
img_a->color_map=g_malloc (img_a->color_map_len);
读block_len字节到color_map(文件指针指向30 + block_len位置)
psd_to_gimp_color_map (img_a->color_map);
img_a->color_map_entries = 256;
3、如果block_len != 0 并且 img_a->color_mode == PSD_DUOTONE
img_a->color_map_len = block_len;
img_a->color_map = g_malloc (img_a->color_map_len);
读block_len字节到color_map(文件指针指向30 + block_len位置)

4、如果img_a->color_mode == PSD_BITMAP
/* Create color map for bitmap image */
img_a->color_map_len = 6;
img_a->color_map = g_malloc (img_a->color_map_len);
memcpy (img_a->color_map, cmap, img_a->color_map_len);
img_a->color_map_entries = 2;


长度 偏移量 说明
4字节 26-29 block_len
block_len 30~(29 + block_len) color_map


文件指针
如果color_mode == PSD_BITMAP 或者 PSD_RGB文件指针指向29
如果color_mode == PSD_INDEXED 或者 PSD_DUOTONE 文件指针指向29 + block_len位置
文件指针设定为CMB


---------------------------------------------------------read_image_resource_block


fread (&block_len, 4, 1, f)
img_a->image_res_len = GUINT32_FROM_BE (block_len);
//得到当前位置的指针
img_a->image_res_start = ftell (f);
//得到资源block大小
block_end = img_a->image_res_start + img_a->image_res_len;

//stream将指向以SEEK_SET为基准,偏移block_end个字节的位置。如果执行失败(比如offset超过文件自身大小),则不改变stream指向的位置

fseek (f, block_end, SEEK_SET)


长度 偏移量 说明
4字节 (CMB+1)~(CMB+1+3) image_res_len(image_resource_block_len)
image_res_len (CMB+1+3+1)~(CMB+1+3+1+image_res_len) 资源block块

文件指针
PSD_RGB 文件指针指向 (33+image_res_len)
定为IRB
...全文
400 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
yan_jiankang 2011-02-24
  • 打赏
  • 举报
回复
你好,我目前在研究这个,能交流下吗,QQ:844240710
zxg1127_1 2010-05-31
  • 打赏
  • 举报
回复
我目前也在研究psd解析的,有时间我们交流一下啊
canshui 2010-05-13
  • 打赏
  • 举报
回复
ou xiang a
up up up ~ ~ ~ ~ ~ ~
影子传说_Hades 2010-05-13
  • 打赏
  • 举报
回复
晕倒,我是C菜鸟,这几天都问了N多菜问题
cy330206 2010-05-13
  • 打赏
  • 举报
回复
高手膜拜。。

69,373

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧