文档章节

PSD解析工具实现(七)

小姚
 小姚
发布于 2016/04/06 21:21
字数 616
阅读 261
收藏 2

上面已经把图层的信息都已经拿到了,剩下的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

 

 

 

 

 

 

 

© 著作权归作者所有

小姚
粉丝 30
博文 135
码字总数 41380
作品 0
广州
程序员
私信 提问
PSD解析工具实现(一)

包括做游戏,我们做程序的很多时候都是需要跟psd打交道,那么如何对psd这个东西进行程序化操作就成为了我们提高工作效率的手段。 相信有研究过psd脚本的人都知道,psd的脚本是用js写的,大体...

小姚
2016/03/23
1K
0
PSD解析工具实现(二)

要想通过文件流的形式来解析psd文件,首先要了解psd的文件格式, adobe的开发者文档里面有着很详细的说明: http://www.adobe.com/devnet-apps/photoshop/fileformatashtml/ 首先,总体来说是...

小姚
2016/03/23
639
0
PSD.rb

PSD.rb 是一个使用Ruby编写的通用的PhotoShop文档解析器,该工具允许你以一种易管理的树结构方式来处理Photoshop文档,从而找出文档中的重要数据,如: 文档结构 文件大小 图层/目录大小和配...

tsl0922
2013/09/07
848
0
Python的PSD解析库--pypsd

pypsd 是 Python 实现的 PSD 文件解析库,目前还没有完全完成,但已经可用。

小编辑
2012/04/18
1K
0
用jmagick能实现psd文件的解析或者图层替换么?

用java和jmagick如何实现psd文件的解析?

shirley8798
2014/04/28
441
0

没有更多内容

加载失败,请刷新页面

加载更多

006-Docker中导出单个或多个tar包

docker中导出单个镜像和多个镜像的tar包 docker save [images] > [name.tar] docker save [images] [images] > [name.tar]...

伟大源于勇敢的开始
今天
6
0
Kotlin基础语法学习

安装好安卓studio,以及插件支持Kotlin 就可以在创建项目的时候选择 Kotlin语言了。 https://www.jianshu.com/p/4ab13691d681 参考手册: https://www.runoob.com/kotlin/otlin-android-setu...

T型人才追梦者
今天
4
0
java实现简单计算器

1.概述 之前作者写过一篇文章,也是关于计算器的,用的是C++与Qt,链接在这里 这次用java的swing写的(这差距好像有点大,好吧是qt太强了). 先上图: 2.UI 总体布局使用流布局. (1)文本框 文本框就...

Blueeeeeee
今天
4
0
纯CSS实现DIV悬浮(固定位置)

纯CSS实现的DIV悬浮效果(固定位置),兼容常用的浏览器:IE8、360、FireFox、Chrome、Safari、Opera、傲游、搜狗、世界之窗等。效果如下: 实现代码: <!DOCTYPE html> <html> <head> <meta ...

独钓渔
今天
6
0
OSChina 周二乱弹 —— 给我来个女菩萨

Osc乱弹歌单(2019)请戳(这里) 【今日歌曲】 @这次装个文艺青年吧 :#今日歌曲推荐#分享XXXTENTACION/Travis Barker的单曲《Pain = BESTFRIEND》: 《Pain = BESTFRIEND》- XXXTENTACION/...

小小编辑
今天
12
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部