/// <summary> /// 压缩数据 /// </summary> /// <param name="data">原始数据</param> /// <param name="startIndex">起始位置</param> /// <param name="count">压缩字节数</param> /// <param name="seek">起始位置</param> /// <param name="memoryPool">数据缓冲区内存池</param> /// <returns>压缩后的数据,失败返回null</returns> internal subArray <byte> GetCompressUnsafe(byte[] data, int startIndex, int count, int seek = 0, memoryPool memoryPool = null) { int length = count + seek; if (memoryPool == null) { using (MemoryStream dataStream = new MemoryStream()) { if (seek != 0) { dataStream.Seek(seek, SeekOrigin.Begin); } using (Stream compressStream = getStream(dataStream)) { compressStream.Write(data, startIndex, count); } if (dataStream.Position < length) { return(subArray <byte> .Unsafe(dataStream.GetBuffer(), seek, (int)dataStream.Position - seek)); } } } else { byte[] buffer = memoryPool.Get(); try { using (MemoryStream dataStream = memoryStream.UnsafeNew(buffer)) { if (seek != 0) { dataStream.Seek(seek, SeekOrigin.Begin); } using (Stream compressStream = getStream(dataStream)) { compressStream.Write(data, startIndex, count); } if (dataStream.Position < length) { byte[] streamBuffer = dataStream.GetBuffer(); if (streamBuffer == buffer) { buffer = null; } return(subArray <byte> .Unsafe(streamBuffer, seek, (int)dataStream.Position - seek)); } } } catch (Exception error) { log.Error.Add(error, null, false); } finally { memoryPool.PushOnly(buffer); } } return(default(subArray <byte>)); }
/// <summary> /// 获取缩略图 /// </summary> /// <param name="data">输出数据</param> /// <param name="width">缩略宽度</param> /// <param name="height">缩略高度</param> /// <param name="type">目标图像文件格式</param> /// <param name="backColor">背景色</param> /// <param name="memoryPool">输出数据缓冲区内存池</param> /// <param name="seek">输出数据起始位置</param> public void Pad(ref subArray <byte> data, ref int width, ref int height, ImageFormat type, Color backColor, memoryPool memoryPool, int seek) { if (checkPad(ref width, ref height)) { if (memoryPool == null) { using (MemoryStream stream = new MemoryStream()) { if (seek != 0) { stream.Seek(seek, SeekOrigin.Begin); } pad(stream, width, height, type, backColor); data.UnsafeSet(stream.GetBuffer(), seek, (int)stream.Position - seek); return; } } byte[] buffer = memoryPool.Get(); try { using (MemoryStream stream = memoryStream.UnsafeNew(buffer)) { if (seek != 0) { stream.Seek(seek, SeekOrigin.Begin); } pad(stream, width, height, type, backColor); byte[] bufferData = stream.GetBuffer(); if (buffer == bufferData) { buffer = null; //showjim if ((int)stream.Position > bufferData.Length) { log.Error.Add("Position " + ((int)stream.Position).toString() + " > " + bufferData.Length.toString(), null, false); } } data.UnsafeSet(bufferData, seek, (int)stream.Position - seek); return; } } finally { memoryPool.PushOnly(buffer); } } data.Null(); }
/// <summary> /// 获取解压数据 /// </summary> /// <returns>解压数据</returns> public unsafe subArray <byte> Get(memoryPool memoryPool) { if (memoryPool == null) { pointer data = fastCSharp.unmanagedPool.StreamBuffers.Get(); try { using (dataStream = new unmanagedStream(data.Byte, fastCSharp.unmanagedPool.StreamBuffers.Size)) { get(); return(new subArray <byte>(dataStream.GetArray())); } } finally { fastCSharp.unmanagedPool.StreamBuffers.Push(ref data); } } else { byte[] data = memoryPool.Get(); try { fixed(byte *dataFixed = data) { using (dataStream = new unmanagedStream(dataFixed, data.Length)) { get(); if (dataStream.data.data == dataFixed) { byte[] buffer = data; data = null; return(subArray <byte> .Unsafe(buffer, 0, dataStream.Length)); } return(new subArray <byte>(dataStream.GetArray())); } } } finally { memoryPool.PushOnly(data); } } }