上面已经把图层的信息都已经拿到了,剩下的byteArray就是图片的通道数据,这里就根据它的通道长度信息来获取对应的值,从而组合成对应的像素生成图片。

Channel Image data一共包含两个部分:

Compression是图片的压缩格式,0是原始数据,未经过任何处理的,1是使用了RLE压缩格式。

这里只处理RLE压缩格式的情况:

for (i = 0; i < layerCount; i++)

{

layerVo = layerVect[i];

layerVo.parsePixel(layerData);

}

public function parsePixel(ba:ByteArray):void

{

var tempObj:Object;

//RGBA通道数据数组,前面已经获取过每种通道的长度信息

for (var i:int = 0; i < channelDataArr.length; i++)

{

tempObj = channelDataArr[i];

tempObj.compressedType = ba.readUnsignedShort();

var pixelDataByte:ByteArray = new ByteArray();

//If the Layer’s Size, and therefore the data, is odd, a pad byte will be inserted at the end of the row.

//放弃最后两个字节

if (tempObj.channelLen - 2 > 1)

{

ba.readBytes(pixelDataByte, 0, tempObj.channelLen - 2);

}

tempObj.pixelData = getRealPixelData(tempObj.compressedType, pixelDataByte);

}

}

private function getRealPixelData(compress:int, data:ByteArray):ByteArray

{

if(1 == compress)

{

//使用height是因为它是按照行来压缩的

return decodeRLE(data, height);

}

return data;

}

//解压缩

public function decodeRLE(source : ByteArray, height : int) : ByteArray

{

source.position = 0;

var lines : Array = new Array(height);

var i : int = 0;

var total : int;

var size : int;

for ( i = 0; i < height; ++i ) {

size = source.readUnsignedShort();

lines[i] = size;

total += lines[i];

}

if (source.position + total != source.length) {

throw new Error("rle decode error");

}

var target : ByteArray = new ByteArray();

var length : int = 0;

var j : int;

var k : int;

var n : int;

var count : int;

for ( i = 0; i < height; ++i ) {

length = lines[i];

j = 0;

count = 0;

while (j < length) {

n = source.readByte();

j++;

if (n >= 0) {

count = n + 1;

for (k = 0;k < count;++k) {

target.writeByte(source.readByte());

}

j += count;

} else {

count = 1 - n;

var byte : int = source.readByte();

for (k = 0;k < count;++k) {

target.writeByte(byte);

}

j++;

}

}

}

return target;

}

根据得到的每种颜色的值进行计算得到对应的像素值:

private static function createPic(layerVo:LayerVo):void

{

if(true == layerVo.isFolder || true == layerVo.isText) return;

var color:uint;

var alphaChannel:ByteArray = (layerVo.channelDataArr[0].pixelData as ByteArray);

var redChannel:ByteArray = (layerVo.channelDataArr[1].pixelData as ByteArray);

var greenChannel:ByteArray = (layerVo.channelDataArr[2].pixelData as ByteArray);

var blueChannel:ByteArray = (layerVo.channelDataArr[3].pixelData as ByteArray);

alphaChannel.position = redChannel.position = greenChannel.position = blueChannel.position = 0;

var bmd:BitmapData = new BitmapData(layerVo.width, layerVo.height);

bmd.lock();

//逐个像素计算颜色值

for (var h:int = 0; h < layerVo.height; h++)

{

for (var w:int = 0; w < layerVo.width; w++)

{

var alpha:uint = alphaChannel.readUnsignedByte();

var red:uint = redChannel.readUnsignedByte();

var green:uint = greenChannel.readUnsignedByte();

var blue:uint = blueChannel.readUnsignedByte();

color = alpha << 24 |red << 16 |green << 8 | blue;

bmd.setPixel32(w, h, color);

}

}

bmd.unlock();

var url:String = File.desktopDirectory.nativePath + "/image/" + layerVo.layerName+".png";

//生成图片

FileUtil.createPng(url, bmd);

}

这个东西讲的有点乱,直接发个整理过的xmind给需要的同学,自己跟着去研究吧:

http://pan.baidu.com/s/1ge8Dnnd

代码的路径,只是做了简单的psd解析成vo,剩下的根据自己的实际需求改呗:

http://pan.baidu.com/s/1i513hHz

php解析psd图层,PSD解析工具实现(七)相关推荐

  1. php编辑psd图层,psd文件怎么编辑

    psd文件怎么编辑? 1.首先下载Photoshop这款软件,下载之后打开.进入首页,点击菜单栏"文件"→"打开",开始打开你的PSD格式文件 2.选择好PSD ...

  2. 基于paint.net制作的C#PSD图层提取工具

    基于paint.net制作的C#PSD图层提取工具.核心代码是photoshop插件开源提供的, 感谢photoshop插件开源提供作者. 网上关于photoshop的图层提取代码好少,找了好久都没找 ...

  3. java xml开源操作类,xml解析和操作的开源工具项目涵盖java c++ php 等语言

    XML解析器-Xerces    XML操作库-dom4j    XML文档解析器-Digester    J2ME-的XML-解析器-kXML XML解析类库-MXP1    XML解析器-LibX ...

  4. java 自定义json解析注解 复杂json解析 工具类

    java 自定义json解析注解 复杂json解析 工具类 目录 java 自定义json解析注解 复杂json解析 工具类 1.背景 2.需求-各式各样的json 一.一星难度json[json对象 ...

  5. php imagick 取得psd缩略图,php imagick 获取psd图层信息

    php imagick 获取psd图层信息 $projectname = 'test'; $im = new Imagick("test.psd"); $num_layers = ...

  6. 抖音风格故障效果PSD图层+剪辑设计必备

    正文: 超级火爆的抖音风格故障效果PSD图层,剪辑设计必备,是一个PSD图层,我们只需要把要处理的图片插入到背景图层下方即可实现一些故障风效果. PSD源码: wwbef.lanzout.com/iO ...

  7. 一键解析还原全景图krpano分析工具

    推荐工具: 全景管家,一款解析全景项目的万能工具https://krpano.scenegram.cn/ 使用方法: 点击链接进入全景管家,将想要下载的全景图的网址输入进去,点击箭头 下方就会打开复制 ...

  8. java代码使用http请求解压zip包并解析xml_Javascript 是如何解析 Excel 文件的?

    最近要做一个导入导出 Excel 的功能,上一次做这个功能的时候,还是用的 Java Apache POI,这是一个用 Java 编写的免费开源的跨平台的 Java API,能够对 Microsoft ...

  9. X-Analyser 总线分析软件:CANopen、1939解析、UDS诊断、NMEA2000 协议解析、DBC文件解析、仿真工具、CAN报文分析、仿CANoe曲线显示 CAN仪表模拟器

    X-Analyser 总线分析软件主要用于:CANopen协议解析.J1939解析 J1939地址ISO15765(UDS诊断) .NMEA2000 协议解析.DBC文件解析 DBC仿真工具.CANo ...

  10. html 解析 流程,html的解析流程

    先抛出几个问题: 1.DomContentLoad是什么 ? 2.Load是什么 ? 3.paint是什么 4.js会阻塞dom的解析吗,js会阻塞dom的渲染吗 ? 5.css会阻塞dom的解析吗, ...

最新文章

  1. 分享Kali Linux 2016.2第41周镜像虚拟机
  2. 【Python】挑战SQL:图解Pandas的数据合并merge
  3. 汇编语言的码制转换小问题--求指教
  4. 后端技术:消息队列MQ/JMS/Kafka相关知识介绍
  5. C# 中 System.Range 结构体
  6. python tkinter进度条_在python3.7中更新tkinter进度条
  7. bzoj 1026: [SCOI2009]windy数(数位dp)
  8. poj1005——I Think I Need a Houseboat
  9. photoshop抠图怀恋抽出滤镜
  10. 无码间串扰的基带传输特性
  11. 关于自抗扰控制的一些中文论文
  12. Ingenuous Cubrency UVA - 11137 立方数之和 递推
  13. 北京市朝阳区 办理 驾驶证期满换证 自助体检 的流程
  14. mldonkey 安装详细过程
  15. vim的安装以及基础使用方法;
  16. 什么是Https、数字签名、数字证书
  17. 华为防火墙的基本安全策略
  18. 动态规划------走楼梯问题
  19. 多字节、UTF-8、Unicode之间的转换
  20. 在校园网中配置路由器的lan口上网

热门文章

  1. C语言sizeof与strlen详解(附大量笔试题题解过程)
  2. 复化辛浦生求积算法C++实现
  3. 如何利用DW快速编写一个简单网页
  4. CAD画图软件测试初学者,CAD制图初学入门:基础操作 平面绘图练习100题,新手必备...
  5. ​什么是bug?bug的源头在哪里?
  6. Google Play安装应用一直在等待下载的解决方案
  7. 湖南师范大学2021年3月25日蓝桥杯热身赛解题报告与标程
  8. win10 永久关闭自动更新
  9. 对bootstrop中左右浮动设置
  10. 送给佳佳同学的礼物:测试流程及并行测试介绍