原文链接

https://code.google.com/archive/p/javastruct/wikis/example_photoshop_acb_file_reader_writer.wiki

翻译用工具

翻译使用的是个人免费版Transmate

译文

如何使用JavaStruct读写Adobe Photoshop Color book文件
JavaStruct对于读写特定的二进制文件也是非常理想的。在这个例子中,我们将写一个 Photoshop Color book 文件读写器。这种文件格式的细节可在这里找到。
完整的代码请到:http://javastruct.googlecode.com/svn/trunk/javastruct/samples/photoshop/
备注:我注意到使用一个nio ByteBuffer写这样一个读写器并不是非常困难(可能更短)。但是JavaStruct提供了更清晰,可维护性更好的代码。并且如果有许多的二进制文件或消息,处理解封包将是非常容易引入错误的。

文件头
在头部,有一个特定的字符串字段. ±-------±----------------------//----------------------------------------+ | Length | UTF-16 Characters \ | ±-------±----------------------//----------------------------------------+
这样首先我们需要将这些字符串用一个特别的结构类表示,姑且叫 A 结构体。我们使用数组长度标记来声明。

@StructClass
public class AString { @StructField (order = 0 ) @ArrayLengthMarker (fieldName = "chars") public int length; @StructField (order = 1) public char[] chars;public AString(String content){ this.length = content.length(); this.chars = content.toCharArray(); } ...
}

下面是实际的头。

@StructClass
public class ACBHeader { public static final short RGB = 0; public static final short CMYK = 2; public static final short LAB = 7; // 签名通常是ASCII字符串“8BCB"@StructField (order = 0) public byte[] signature = {'8', 'B', 'C', 'B'}; //Photoshop 7 仅打开版本为1(0x0001)的文件@StructField (order = 1) public short fileVersion; // 唯一识别符@StructField (order = 2) public short colorBookIdentifier; @StructField (order = 3) public AString title; @StructField (order = 4) public AString colorNamePrefix; @StructField (order = 5) public AString colorNamePostfix; // 通常是一个版权声明@StructField (order = 6) public AString description; @StructField (order = 7) public short colorCount; // Photoshop 每页显示颜色数.这个字段指定了// 能够在一个页面上显示的颜色的最大数量. @StructField (order = 8) public short colorsPerPage; @StructField (order = 9) public short pageSelectorOffset; // RGB, CMYK or Lab @StructField (order = 10) public short colorSpaceID; ...

读取颜色
这里是比较棘手的部分。通过格式化,颜色值和它的格式是依赖于 colorSpaceID 字段。其可以是RGB,CMYK或者Lab。这样我们对每一个颜色域写一个类。这里有颜色数据的”colorCount"数量值。

@StructClass
public class RGBColor{ @StructField (order = 0) public AString name; @StructField (order = 1) public byte[] code = new byte[6]; @StructField (order = 2) public byte red; @StructField (order = 3) public byte green; @StructField (order = 4) public byte blue; ...
} @StructClass
public class LabColor { @StructField (order = 0) public AString name; @StructField (order = 1) public byte[] code = new byte[6]; @StructField (order = 2) public byte lightness; @StructField (order = 3) public byte aChrom; @StructField (order = 4) public byte bChrom; ...
}

注意对于每个颜色类都包含名字和编码字段。这是必要的,因为当前结构体类并不是从一个结构体基类派生的。

读写器
为了读和写acb文件,我们初始化了包含FileStream的StructPacker和StructUnpacker类。之后,读文件头和颜色值就直截了当。

public class AdobeColorBook { ACBHeader header;RGBColor[] rgbColors = null; CMYKColor[] cmykColors = null; LabColor[] labColors = null; public void read(String acbFile){ try { FileInputStream fis = new FileInputStream(new File(acbFile)); header = new ACBHeader(); StructUnpacker up = JavaStruct.getUnpacker(fis, ByteOrder.BIG_ENDIAN); up.readObject(header); switch(header.ColorSpaceID){ case ACBHeader.RGB : rgbColors = new RGBColor[header.colorCount]; for(int i=0; i<header.colorCount; i++){ rgbColors[i] = new RGBColor(); up.readObject(rgbColors[i]); } break; case ACBHeader.CMYK : cmykColors = new CMYKColor[header.colorCount]; for(int i=0; i<header.colorCount; i++){ cmykColors[i] = new CMYKColor(); up.readObject(cmykColors[i]); } break; case ACBHeader.LAB : labColors = new LabColor[header.colorCount]; for(int i=0; i<header.colorCount; i++){ labColors[i] = new LabColor(); up.readObject(labColors[i]); } break; default: } } catch (FileNotFoundException e) { e.printStackTrace(); } catch (StructException e) { e.printStackTrace(); } } public void write(String name){ try{ FileOutputStream fo = new FileOutputStream(new File(name)); StructPacker packer = JavaStruct.getPacker(fo, ByteOrder.BIG_ENDIAN); packer.writeObject(header); switch(header.ColorSpaceID){ case ACBHeader.RGB : for(RGBColor color : rgbColors){ packer.writeObject(color); } break; case ACBHeader.CMYK : for(CMYKColor color : cmykColors){ packer.writeObject(color); } break; case ACBHeader.LAB : for(LabColor color : labColors){ packer.writeObject(color); } break; default: } fo.close(); } catch(StructException e){ e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } } public String toString(){ String str = ""; if (header != null){ str += header; } switch(header.ColorSpaceID){ case ACBHeader.RGB : for(RGBColor color : rgbColors) { str += color + "\n"; } break; case ACBHeader.CMYK : for(CMYKColor color : cmykColors) { str += color + "\n"; } break; case ACBHeader.LAB : for(LabColor color : labColors) { str += color + "\n"; } break; } return str; } public static void main(String[] args) { AdobeColorBook anpaBook = new AdobeColorBook(); anpaBook.read("ANPA Color.acb"); anpaBook.write("ANPA_my_Color.acb"); System.out.println(anpaBook); }
}

javaStruct - 通讯协议的解封包第三方库--(二)官方文档三相关推荐

  1. javaStruct - 通讯协议的解封包第三方库--(二)官方文档二

    原文链接 https://code.google.com/archive/p/javastruct/ 翻译用工具 翻译使用的是个人免费版Transmate 译文 简介 当与嵌入式设备和其他使用C语言样 ...

  2. javaStruct - 通讯协议的解封包第三方库--(二)官方文档一

    原文链接 https://code.google.com/archive/p/javastruct/ 翻译用工具 翻译使用的是个人免费版Transmate 译文 javastruct 一个将java对 ...

  3. python数据科学和机器学习常用库的官方文档

    文章目录 Matplotlib Numpy Pandas sklearn sklearn_crfsuite SciPy Matplotlib 进入matplotlib官网地址:https://matp ...

  4. python 笔记 :Gym库 (官方文档笔记)

    Gym是一个开发和比较强化学习算法的工具箱.它不依赖强化学习算法结构,并且可以使用很多方法对它进行调用. 1 Gym环境 这是一个让某种小游戏运行的简单例子. 这将运行 CartPole-v0 环境实 ...

  5. 【清单】语言、框架及库的官方文档、examples、tutorials

    spark:Quick Start tensorflow: 官方文档中文版:介绍 | TensorFlow 官方文档中文版 tutorials:Get Started with TensorFlow

  6. Poco 库开发-教你如何读Poco的官方文档

    引言 在使用任何一种框架开发的时候,都不免要阅读官方的文档. 下面就讲述如何来读Poco库的官方文档 Poco库 在我们下载好Poco 后,会有两个文件夹,一个是放文档的doc,另外一个就是代码了,这 ...

  7. 如何快速一次性卸载所有python包(第三方库)呢

    这篇文章主要介绍了如何快速一次性卸载所有python包(第三方库)呢,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧 很多时候我们 ...

  8. 官方文档链接(Core Graphics、View Controller、UICollectionView、UITableView、第三方库)

    Core Graphics Quartz 2D Programming Guide Core Graphics (Framework) Drawing(UIKit).Images and PDF(UI ...

  9. 【pytest官方文档】解读- 开发可pip安装的第三方插件

    在上一篇的 hooks 函数分享中,开发了一个本地插件示例,其实已经算是在编写插件了.今天继续跟着官方文档学习更多知识点. 一个插件包含一个或多个钩子函数,pytest 正是通过调用各种钩子组成的插件 ...

最新文章

  1. 2015级C++第14周实践项目 模板
  2. 机器学习可解释性工具箱XAI
  3. Head First Design Pattern
  4. python随机画散点图-python散点图实例之随机漫步
  5. 在EF中使用SQL执行简单高效的增删查操作
  6. Catalina.stop: Connect refused解决过程
  7. Mac 下安装 Python-OpenCV Python-OpenCV 处理图像(一):基本操作
  8. 拒绝“肌肉记忆”,卡萨帝迈进场景品牌新赛道
  9. 面向对象编程——获取对象信息(五)
  10. lrange是取出所有值并移除么_部落冲突:兵营容量提升,移除超级部队、英雄防御状态冷却时间...
  11. 交叉调试 arm linux,搭建交叉调试环境Arm-Linux-Gdb与gdbserver
  12. 【codevs2287】火车站,第一个A掉的钻石题(迟来的解题报告)
  13. 03-neo4j的命令
  14. sql创建表主键gui_在SQL Server中使用主数据服务快速创建最终用户可以维护的GUI
  15. 静态页面评论处理以及列表处理
  16. C++中编译速度与平时代码规范
  17. 应用程序图标丢失快捷方式没有图标怎么办
  18. macd底背离的python_Python量化交易之MACD#39;顶底背离#39;形态的实现,自动化交易!...
  19. 为什么易语言程序被360和windows安全中心认作是病毒?
  20. 数据科学 案例7 决策树之电脑购买(代码)

热门文章

  1. 【操作系统之哲学导论】内存原理篇
  2. ewma 指数加权平均
  3. mavenproject1-1.0-SNAPSHOT.jar中没有主清单属性——修改MANIFEST.MF
  4. 帷幄前沿茶话丨如何发起一场直播间运营变革?
  5. java 回车换行替换_java中替换字符以及回车换行
  6. 圣诞节送什么礼物好?高颜值耐用的蓝牙耳机推荐
  7. Mybatis-Plus的介绍和使用
  8. TC Disrupt San Francisco 2011冠军出炉,Shaker问鼎
  9. 多位中青年科研人员早逝!985教授:不要拿生命做研究...
  10. Android系统中app包名、activity名汇总