Esempio n. 1
0
        public HsImage(Stream imageStream)
        {
            byte[] datas = new byte[imageStream.Length];

            imageStream.Seek(0, SeekOrigin.Begin);

            imageStream.Read(datas, 0, datas.Length);


            #region 获取图像大小

            IPlatformExtension platformExtension = DependencyService.Get <IPlatformExtension>(DependencyFetchTarget.GlobalInstance);



            Tuple <System.Drawing.Size, byte[]> imageData = platformExtension.ReduceImage(datas, 800);

            System.Drawing.Size size = imageData.Item1;
            datas = imageData.Item2;

            #endregion

            #region 记录元数据

            byte[] metabs = new byte[METALEN];

            using (MemoryStream ms = new MemoryStream(metabs))
            {
                //以小端方式记录元数据。
                using (BinaryWriter bw = new BinaryWriter(ms, Encoding.Unicode))
                {
                    bw.Write(ENDIAN_LITTLE); //记录第一位
                    bw.Write(JPG);           //记录2-5位
                    bw.Write(size.Width);    //记录6-9位
                    bw.Write(size.Height);   //记录10-13位
                }
            }

            #endregion

            _imageData = ImageSource.FromStream(() =>
            {
                return(new MemoryStream(datas));
            });

            _imageDataString = HsBase64.ToBase64(metabs.Concat(datas).ToArray());
        }
Esempio n. 2
0
        public HsImage(string imageDataString)
        {
            if (imageDataString.Split(',').Length > 1)
            {
                throw new HsException("无法识别的旧的图像格式");
            }

            byte[] buffers = HsBase64.FromBase64ToBytes(imageDataString);

            byte[] datas = new byte[buffers.Length - METALEN];

            using (MemoryStream bufferStream = new MemoryStream(buffers))
            {
                int endian = buffers[0];

                using (BinaryReader br = new BinaryReader(bufferStream, endian == ENDIAN_BIG ? Encoding.BigEndianUnicode : Encoding.Unicode))
                {
                    br.ReadByte();               //越过第一位

                    int format = br.ReadInt32(); //读取2-5位

                    if (format == PIXEL)
                    {
                        throw new HsException("不支持PIXEL图像格式");
                    }

                    bufferStream.Seek(METALEN, SeekOrigin.Begin);

                    bufferStream.Read(datas, 0, datas.Length);
                }
            }

            this._imageDataString = imageDataString;

            this._imageData = ImageSource.FromStream(() =>
            {
                return(new MemoryStream(datas));
            });
        }
Esempio n. 3
0
        private async Task downloadAndOpen(HsFile item)
        {
            //如果文件存在与本地,则直接打开,否则先下载再打开。

            string[] cachePath = new string[] { "Cache", "Files" };

            string cachefilename = $"{item.FileHash}.{item.FileName}";

            IPlatformExtension pe = DependencyService.Get <IPlatformExtension>(DependencyFetchTarget.GlobalInstance);

            if (!pe.FileExist(cachefilename, cachePath)) //文件不存在需要下载
            {
                int index = 0;

                using (MemoryStream ms = new MemoryStream())
                {
                    while (true)
                    {
                        //下载文件...
                        HsLabelValue result = await GetWSUtil().GetSysFileSeg(GetLoginData().ProgressId, item.FileHash, index);

                        if (result == null) //文件读取完毕
                        {
                            break;
                        }

                        byte[] buffer = HsBase64.FromBase64ToBytes(result.GetValueByLabel("Data"));

                        //数据解压缩
                        buffer = HsZlib.DecompressData(buffer);

                        ms.Write(buffer, 0, buffer.Length);

                        index++;
                    }

                    byte[] fileData = ms.ToArray();

                    Debug.WriteLine(HsMD5.EncryptionMD5(fileData));

                    await pe.WriteFile(cachefilename, fileData, 2, cachePath);
                }

                await downloadAndOpen(item);
            }
            else
            {
                List <string> previewFiletypes = new List <string>()
                {
                    "DOC", "DOCX",
                    "XLS", "XLSX",
                    "PPT", "PPTX",
                    "PDF",
                    "TXT", "TEXT",
                    "JPG", "PNG"
                };

                if (previewFiletypes.Contains(item.FileType.ToUpper()))
                {
                    string url = pe.GetFileURL(cachefilename, cachePath);

                    if (!string.IsNullOrWhiteSpace(url))
                    {
                        Panel_PreviewFile panel = new Panel_PreviewFile();

                        panel.Source = new UrlWebViewSource()
                        {
                            Url = url
                        };

                        await Navigation.PushAsync(panel);
                    }
                }
                else
                {
                    pe.CallFile(cachefilename, cachePath);
                }
            }
        }