Exemple #1
0
        /// <summary>
        /// Verify that the PSD file will fit into physical memory once loaded
        /// and converted to Paint.NET format.
        /// </summary>
        /// <remarks>
        /// This check is necessary because layers in Paint.NET have the same
        /// dimensions as the canvas.  Thus, PSD files that contain lots of
        /// tiny adjustment layers may blow up in size by several
        /// orders of magnitude.
        /// </remarks>
        internal static void CheckSufficientMemory(PsdFile psdFile)
        {
            // Multichannel images have channels converted to layers
            var numLayers = (psdFile.ColorMode == PsdColorMode.Multichannel)
                ? psdFile.BaseLayer.Channels.Count
                : Math.Max(psdFile.Layers.Count, 1);

            // Paint.NET also requires a scratch layer and composite layer
            numLayers += 2;

            long  numPixels     = (long)psdFile.ColumnCount * psdFile.RowCount;
            ulong bytesRequired = (ulong)(checked (4 * numPixels * numLayers));

            // Check that the file will fit entirely into physical memory, so that we
            // do not thrash and make the Paint.NET UI nonresponsive.  We also have
            // to check against virtual memory address space because 32-bit processes
            // cannot access all 4 GB.
            //var computerInfo = new Microsoft.VisualBasic.Devices.ComputerInfo();
            //var accessibleMemory = Math.Min(computerInfo.TotalPhysicalMemory,
            //  computerInfo.TotalVirtualMemory);
            var accessibleMemory = (ulong)SystemInfo.systemMemorySize * 1024 * 1024;

            if (bytesRequired > accessibleMemory)
            {
                throw new OutOfMemoryException();
            }
        }
Exemple #2
0
        /// <summary>
        /// Set the resolution on the Paint.NET Document to match the PSD file.
        /// </summary>
        private static void SetPdnResolutionInfo(PsdFile psdFile, Document document)
        {
            if (psdFile.Resolution != null)
            {
                // PSD files always specify the resolution in DPI.  When loading and
                // saving cm, we will have to round-trip the conversion, but doubles
                // have plenty of precision to spare vs. PSD's 16/16 fixed-point.

                if ((psdFile.Resolution.HResDisplayUnit == ResolutionInfo.ResUnit.PxPerCm) &&
                    (psdFile.Resolution.VResDisplayUnit == ResolutionInfo.ResUnit.PxPerCm))
                {
                    document.DpuUnit = MeasurementUnit.Centimeter;

                    // HACK: Paint.NET truncates DpuX and DpuY to three decimal places,
                    // so add 0.0005 to get a rounded value instead.
                    document.DpuX = psdFile.Resolution.HDpi / 2.54 + 0.0005;
                    document.DpuY = psdFile.Resolution.VDpi / 2.54 + 0.0005;
                }
                else
                {
                    document.DpuUnit = MeasurementUnit.Inch;
                    document.DpuX    = psdFile.Resolution.HDpi;
                    document.DpuY    = psdFile.Resolution.VDpi;
                }
            }
        }
Exemple #3
0
        public static ImageC FromStream(Stream stream)
        {
            long PreviousPosition = stream.Position;

            // Read some start bytes
            long startPos = stream.Position;

            byte[] startBytes = new byte[18];
            stream.Read(startBytes, 0, 18);
            stream.Position = startPos;

            // Detect special image types
            if (startBytes[0] == 0x44 && startBytes[1] == 0x44 && startBytes[2] == 0x53 && startBytes[3] == 0x20)
            { // dds image
                return(FromPfimImage(Pfim.Dds.Create(stream, new Pfim.PfimConfig())));
            }
            else if (startBytes[0] == 0x38 && startBytes[1] == 0x42 && startBytes[2] == 0x50 && startBytes[3] == 0x53)
            { // psd image
                PsdFile image = new PsdFile();
                image.Load(stream);
                using (Image image2 = ImageDecoder.DecodeImage(image))
                    return(FromSystemDrawingImage(image2));
            }
            else if (IsTga(startBytes))
            { // tga image
                return(FromPfimImage(Pfim.Targa.Create(stream, new Pfim.PfimConfig())));
            }
            else
            { // other image
                using (Image image = Image.FromStream(stream))
                    return(FromSystemDrawingImage(image));
            }
        }
Exemple #4
0
        /// <summary>
        /// PSDファイルをトップレベルのレイヤグループ単位で分割します
        /// </summary>
        /// <param name="outdir_prefix">出力先フォルダのプリフィクス</param>
        /// <param name="split_anime_layer">アニメーションレイヤグループ(「@」から始まるレイヤグループ)の展開を許可します</param>
        public void Split()
        {
            //出力先ディレクトリを作成する
            string out_dir;

            out_dir = Path.Combine(Path.GetDirectoryName(InputFilePath), OutputDirPrefix + Path.GetFileName(InputFilePath));
            out_dir = Path.GetFullPath(out_dir);

            if (!Directory.Exists(out_dir))
            {
                Directory.CreateDirectory(out_dir);
            }

            //PSDを分解する
            List <KeyValuePair <string, List <Layer> > > splitted_layers = SplitPsd();


            //分解したPSDそれぞれ保存する
            for (int i = 0; i < splitted_layers.Count; i++)
            {
                string       name   = splitted_layers[i].Key;
                List <Layer> layers = splitted_layers[i].Value;

                PsdFile psd_out = MakePsd(InputPsdFile, layers);

                string out_filename = string.Format("{0}-{1}.psd", Path.GetFileNameWithoutExtension(InputFilePath), name);
                Array.ForEach(Path.GetInvalidFileNameChars(), x =>
                {
                    out_filename = out_filename.Replace(x, '_');
                });


                psd_out.Save(Path.Combine(out_dir, out_filename), Encoding.UTF8);
            }
        }
        private static Channel CreateChannel(ImageCompression compression,
                                             Size size, int bitDepth)
        {
            var psd = new PsdFile(PsdFileVersion.Psd)
            {
                BitDepth  = bitDepth,
                ColorMode = (bitDepth == 1) ? PsdColorMode.Bitmap : PsdColorMode.RGB
            };

            var layer = new Layer(psd)
            {
                Rect = new Rectangle(Point.Empty, size)
            };

            psd.Layers.Add(layer);

            var channel = new Channel((short)0, layer)
            {
                ImageCompression = compression
            };

            layer.Channels.Add(channel);

            return(channel);
        }
Exemple #6
0
        public static PsdFile MakePsd(PsdFile basefile, IEnumerable <Layer> layers)
        {
            PsdFile psd = new PsdFile();

            psd.ChannelCount     = basefile.ChannelCount;
            psd.ColorMode        = basefile.ColorMode;
            psd.BitDepth         = basefile.BitDepth;
            psd.RowCount         = basefile.RowCount;
            psd.ColumnCount      = basefile.ColumnCount;
            psd.ImageCompression = basefile.ImageCompression;
            psd.Resolution       = basefile.Resolution;

            // 画像データのスペースを確保する
            int imageSize = psd.RowCount * psd.ColumnCount;

            psd.Layers.Clear();
            for (short i = 0; i < psd.ChannelCount; i++)
            {
                var channel = new Channel(i, psd.BaseLayer);
                channel.ImageData        = new byte[imageSize];
                channel.ImageCompression = psd.ImageCompression;
                psd.BaseLayer.Channels.Add(channel);
            }


            psd.Layers.AddRange(layers);

            return(psd);
        }
Exemple #7
0
        private static Bitmap LoadImageFromCache(string sFile)
        {
            Bitmap zBitmap;
            var    sKey = sFile.ToLower();

            if (!s_dictionaryImages.TryGetValue(sKey, out zBitmap))
            {
                if (s_dictionaryImages.Count > IMAGE_CACHE_MAX)
                {
                    // TODO: this is a terrible eviction strategy
                    DumpImagesFromDictionary(s_dictionaryImages);
                }
                if (!File.Exists(sFile))
                {
                    sFile = ProjectManager.Instance.ProjectPath + sFile;
                    if (!File.Exists(sFile))
                    {
                        return(null);
                    }
                }

                Bitmap zSourceImage;
                try
                {
                    switch (Path.GetExtension(sFile).ToLower())
                    {
                    case ".psd":
                    {
                        var zFile = new PsdFile();
                        zFile.Load(sFile);
                        zSourceImage = ImageDecoder.DecodeImage(zFile);
                    }
                    break;

                    default:
                        zSourceImage = new Bitmap(sFile);
                        break;
                    }
                }
                catch (Exception)
                {
                    // return a purple bitmap to indicate an error
                    zBitmap = new Bitmap(1, 1);
                    Graphics.FromImage(zBitmap).FillRectangle(Brushes.Purple, 0, 0, zBitmap.Width, zBitmap.Height);
                    return(zBitmap);
                }

                zBitmap = new Bitmap(zSourceImage.Width, zSourceImage.Height);

                // copy the contents into the image
                Graphics zGraphics = Graphics.FromImage(zBitmap);
                zGraphics.DrawImage(zSourceImage, new Rectangle(0, 0, zBitmap.Width, zBitmap.Height), 0, 0, zBitmap.Width, zBitmap.Height, GraphicsUnit.Pixel);

                // duping the image into a memory copy allows the file to change (not locked by the application)
                zSourceImage.Dispose();
                CacheImage(s_dictionaryImages, sKey, zBitmap);
            }
            return(zBitmap);
        }
Exemple #8
0
    public void LoadInformation(Texture2D Img)
    {
        string path = AssetDatabase.GetAssetPath(Img);

        psd      = new PsdFile(path, Encoding.Default);
        fileName = Path.GetFileNameWithoutExtension(path);
        ApplyLayerSections(psd.Layers);
    }
Exemple #9
0
        public IList <IPsdLayer> GetLayersAndSize(Stream s, out Size size)
        {
            PsdFile file = new PsdFile();

            file.Load(s);
            size = new Size(file.Columns, file.Rows);
            return(getLayers(file));
        }
Exemple #10
0
        public static PsdFile ImportPSD(string path)
        {
            PsdFile psd = null;

            psd = new PsdFile(path, Encoding.Default);
            Debug.Log("Import PSD File " + Path.GetFileNameWithoutExtension(path));
            return(psd);
        }
        public static LayerNode ParseLayerTree(PsdFile psd)
        {
            LayerNode root = new LayerNode();

            ParseLayerTree(psd.Layers.GetEnumerator(), root);

            return(root);
        }
Exemple #12
0
 public SaveLayerPixelsContext(BitmapLayer layer, PsdFile psdFile,
                               Document input, PhotoshopFile.Layer psdLayer, PsdSaveConfigToken psdToken)
 {
     this.layer    = layer;
     this.psdFile  = psdFile;
     this.input    = input;
     this.psdToken = psdToken;
     this.psdLayer = psdLayer;
 }
Exemple #13
0
        private void ImportLayers()
        {
            //PSDExporter.CreateSprite(settings, 8);
            PsdFile psd   = settings.Psd;
            Layer   layer = psd.Layers[8];

            PSDExporter.CreateTexture(layer);
            //PSDExporter.Export(settings, fileInfo);
        }
Exemple #14
0
        private void OnOpenClick(object sender, EventArgs e)
        {
            string fileName = m_fileName.Text;

            if (File.Exists(fileName))
            {
                UpdateFileLst(fileName);

                PsdFile pt = new PsdFile();

                this.Cursor = Cursors.WaitCursor;
                pt.Load(fileName);

                m_fileStructure.Nodes.Clear();

                TreeNode fileNode = new TreeNode("PSD File");
                fileNode.Tag = pt;

                m_fileStructure.Nodes.Add(fileNode);

                foreach (Layer layer in pt.Layers)
                {
                    TreeNode layerNode = new TreeNode("Layer Name=" + layer.Name);
                    layerNode.Tag = layer;
                    fileNode.Nodes.Add(layerNode);

                    foreach (Layer.Channel ch in layer.Channels)
                    {
                        TreeNode chNode = new TreeNode("Channel ID=" + ch.ID.ToString());
                        chNode.Tag = ch;
                        layerNode.Nodes.Add(chNode);
                    }

                    TreeNode maskNode = new TreeNode("Mask");
                    maskNode.Tag = layer.MaskData;
                    layerNode.Nodes.Add(maskNode);

                    TreeNode blendingNode = new TreeNode("BlendingRangesData");
                    blendingNode.Tag = layer.BlendingRangesData;
                    layerNode.Nodes.Add(blendingNode);

                    foreach (Layer.AdjustmentLayerInfo adjInfo in layer.AdjustmentInfo)
                    {
                        TreeNode node = new TreeNode(adjInfo.Key);
                        node.Tag = adjInfo;
                        layerNode.Nodes.Add(node);
                    }
                }

                m_fileStructure.SelectedNode = fileNode;

                this.Cursor = Cursors.Default;

                //pt.Save(Path.Combine(Path.GetDirectoryName(m_fileName.Text), Path.GetFileNameWithoutExtension(m_fileName.Text) + "-s.psd"));
            }
        }
Exemple #15
0
        private IList <IPsdLayer> getLayers(PsdFile file)
        {
            List <IPsdLayer> items = new List <IPsdLayer>(file.Layers.Count);

            for (int i = 0; i < file.Layers.Count; i++)
            {
                items.Add(new PsdLayer(file.Layers[i], i));
            }
            return(items);
        }
Exemple #16
0
        /// <summary>
        /// Imports a Photoshop document (.psd) file at the given path.
        /// </summary>
        /// <param name="asset">The path of to the .psd file relative to the project.</param>
        private static void Import(string asset)
        {
            currentDepth = MaximumDepth;
            string fullPath = Path.Combine(GetFullProjectPath(), asset.Replace('\\', '/'));

            PsdFile psd = new PsdFile(fullPath);

            CanvasSize = new Vector2(psd.Width, psd.Height);

            // Set the depth step based on the layer count.  If there are no layers, default to 0.1f.
            depthStep = psd.Layers.Count != 0 ? MaximumDepth / psd.Layers.Count : 0.1f;

            int    lastSlash = asset.LastIndexOf('/');
            string assetPathWithoutFilename = asset.Remove(lastSlash + 1, asset.Length - (lastSlash + 1));

            PsdName = asset.Replace(assetPathWithoutFilename, string.Empty).Replace(".psd", string.Empty);

            currentPath = GetFullProjectPath() + "Assets";
            currentPath = Path.Combine(currentPath, PsdName);
            Directory.CreateDirectory(currentPath);

            if (LayoutInScene || CreatePrefab)
            {
                if (UseUnityUI)
                {
                    CreateUIEventSystem();
                    CreateUICanvas();
                    rootPsdGameObject = Canvas;
                }
                else
                {
                    rootPsdGameObject = new GameObject(PsdName);
                }

                currentGroupGameObject = rootPsdGameObject;
            }

            List <Layer> tree = BuildLayerTree(psd.Layers);

            ExportTree(tree);

            if (CreatePrefab)
            {
                UnityEngine.Object prefab = PrefabUtility.CreateEmptyPrefab(asset.Replace(".psd", ".prefab"));
                PrefabUtility.ReplacePrefab(rootPsdGameObject, prefab);

                if (!LayoutInScene)
                {
                    // if we are not flagged to layout in the scene, delete the GameObject used to generate the prefab
                    UnityEngine.Object.DestroyImmediate(rootPsdGameObject);
                }
            }

            AssetDatabase.Refresh();
        }
Exemple #17
0
        /// <summary>
        /// Reset everything back to default
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void NewMenu_Click(object sender, RoutedEventArgs e)
        {
            // Clear our ListView, Canvas, Images
            HudItemList.Items.Clear();
            HudCanvas.Children.Clear();

            // Set all back to null
            psdFile              = null;
            selectedHudElem      = null;
            selectedPreviewImage = null;
        }
Exemple #18
0
        /// <summary>
        /// コンストラクタ
        /// </summary>
        /// <param name="filepath">入力PSDファイルパス</param>
        /// <param name="nonUnicodeEncoding">非ユニコードのレイヤ名のエンコーディング</param>
        public PsdSplitter(string filepath, Encoding nonUnicodeEncoding)
        {
            InputFilePath   = Path.GetFullPath(filepath);
            InputPsdFile    = new PsdFile();
            OutputDirPrefix = "out-";


            using (var fs = new FileStream(filepath, FileMode.Open, FileAccess.Read))
            {
                InputPsdFile.Load(fs, nonUnicodeEncoding);
            }
        }
Exemple #19
0
        public static void Generator(PsdFile psd, UIAtlas uiAtlas, string rootName)
        {
            Debug.Log("Generate Start!");
            Debug.Log(psd.BaseLayer.Rect.width + "  " + psd.BaseLayer.Rect.height);
            GameObject root = null;

            if (rootName == null || (root = GameObject.Find(rootName)) == null)
            {
                Debug.LogError("Root not found!");
                return;
            }
            foreach (Layer layer in psd.Layers)
            {
                if (layer.Name != "</Layer set>" &&
                    layer.Name != "</Layer group>" &&
                    layer.Visible &&
                    layer.Rect.width > 0 &&
                    layer.Rect.height > 0)
                {
                    Debug.Log(layer.Name);
                    Debug.Log(layer.Rect.width + "  " + layer.Rect.height);
                    string pattern       = "label_";
                    Regex  regexInstance = new Regex(pattern);
                    if (regexInstance.IsMatch(layer.Name))
                    {
                        UILabel label = NGUITools.AddWidget <UILabel>(root, 1);
                        label.pivot = UIWidget.Pivot.TopLeft;
                        Vector3 spritePos = new Vector3(layer.Rect.position.x - psd.BaseLayer.Rect.width / 2, psd.BaseLayer.Rect.height / 2 - layer.Rect.position.y);
                        Debug.Log("before: " + layer.Rect.position + " after: " + spritePos);
                        label.name   = layer.Name;
                        label.width  = (int)layer.Rect.width;
                        label.height = (int)layer.Rect.height;
                        label.transform.localPosition = spritePos;
                        label.pivot = UIWidget.Pivot.Center;
                    }
                    else
                    {
                        UISprite sprite = NGUITools.AddSprite(root, uiAtlas, layer.Name, 1);
                        sprite.pivot = UIWidget.Pivot.TopLeft;
                        Vector3 spritePos = new Vector3(layer.Rect.position.x - psd.BaseLayer.Rect.width / 2, psd.BaseLayer.Rect.height / 2 - layer.Rect.position.y);
                        Debug.Log("before: " + layer.Rect.position + " after: " + spritePos);
                        sprite.name   = layer.Name;
                        sprite.width  = (int)layer.Rect.width;
                        sprite.height = (int)layer.Rect.height;
                        sprite.transform.localPosition = spritePos;
                        sprite.pivot = UIWidget.Pivot.Center;
                        sprite.type  = UISprite.Type.Sliced;
                    }
                }
            }
        }
Exemple #20
0
        private void executeButton_Click(object sender, EventArgs e)
        {
            if (string.IsNullOrEmpty(folderPath) || string.IsNullOrEmpty(filePath))
            {
                MessageBox.Show("ファイルまたはフォルダが選択されていません");
                return;
            }

            PsdFile psd = new PsdFile();

            psd.Load(filePath);
            List <string> layerName = new List <string>();

            foreach (var layer in psd.Layers)
            {
                layerName.Add(layer.Name);
            }

            using (MagickImageCollection imgs = new MagickImageCollection(filePath))
            {
                for (int i = 0; i < imgs.Count; i++)
                {
                    imgs[i].GifDisposeMethod = GifDisposeMethod.Background;
                }

                imgs.Coalesce();

                for (int i = 0; i < imgs.Count; i++)
                {
                    imgs[i].GifDisposeMethod = GifDisposeMethod.Background;
                    string saveFileName;
                    try
                    {
                        saveFileName = Path.Combine(folderPath, layerName[i] + ".png");
                    }
                    catch
                    {
                        saveFileName = "error_name";
                    }

                    imgs[i].Write(saveFileName);
                }

                imgs.RemoveAt(0);
            }



            //Application.Exit();
        }
Exemple #21
0
    /////////////////////////////////////////////////////////////////////////// 

    unsafe private static void SetPDNColor(ColorBgra* dstPixel, PsdFile psdFile, int pos)
    {
      switch (psdFile.ColorMode)
      {
        case PsdFile.ColorModes.RGB:
          dstPixel->R = psdFile.ImageData[0][pos];
          dstPixel->G = psdFile.ImageData[1][pos];
          dstPixel->B = psdFile.ImageData[2][pos];
          break;
        case PsdFile.ColorModes.CMYK:
          SetPDNColorCMYK(dstPixel,
              psdFile.ImageData[0][pos],
              psdFile.ImageData[1][pos],
              psdFile.ImageData[2][pos],
              psdFile.ImageData[3][pos]);
          break;
        case PsdFile.ColorModes.Multichannel:
          SetPDNColorCMYK(dstPixel,
              psdFile.ImageData[0][pos],
              psdFile.ImageData[1][pos],
              psdFile.ImageData[2][pos],
              0);
          break;
        case PsdFile.ColorModes.Bitmap:
          byte bwValue = ImageDecoder.GetBitmapValue(psdFile.ImageData[0], pos);
          dstPixel->R = bwValue;
          dstPixel->G = bwValue;
          dstPixel->B = bwValue;
          break;
        case PsdFile.ColorModes.Grayscale:
        case PsdFile.ColorModes.Duotone:
          dstPixel->R = psdFile.ImageData[0][pos];
          dstPixel->G = psdFile.ImageData[0][pos];
          dstPixel->B = psdFile.ImageData[0][pos];
          break;
        case PsdFile.ColorModes.Indexed:
          int index = (int)psdFile.ImageData[0][pos];
          dstPixel->R = (byte)psdFile.ColorModeData[index];
          dstPixel->G = psdFile.ColorModeData[index + 256];
          dstPixel->B = psdFile.ColorModeData[index + 2 * 256];
          break;
        case PsdFile.ColorModes.Lab:
          SetPDNColorLab(dstPixel,
            psdFile.ImageData[0][pos],
            psdFile.ImageData[1][pos],
            psdFile.ImageData[2][pos]);
          break;
      }
    }
Exemple #22
0
        /// <summary>
        /// Modify Sprite atlass meta by Psd Layer
        /// </summary>
        public static void CreatSpriteFromLayers(PsdFile psd, AssetImporter importer)
        {
            TextureImporter texImp = importer as TextureImporter;
            string          name   = Path.GetFileNameWithoutExtension(importer.assetPath);

            name = name.Replace("_" + psdImportSettings.psdSuffix, "");
            SpriteMetaData[]      tmpMeta = texImp.spritesheet;
            List <SpriteMetaData> sprMeta = new List <SpriteMetaData>();

            texImp.textureType      = TextureImporterType.Sprite;
            texImp.spriteImportMode = SpriteImportMode.Multiple;

            //texImp.spritePixelsPerUnit = 100;
            //texImp.spritePackingTag = null;
            //texImp.anisoLevel = 1;
            //texImp.wrapMode = TextureWrapMode.Repeat;
            //texImp.filterMode = FilterMode.Bilinear;

            foreach (Layer layer in psd.Layers)
            {
                if (layer.Name != "</Layer set>" &&
                    layer.Name != "</Layer group>" &&
                    layer.Visible &&
                    layer.Rect.width > 0 &&
                    layer.Rect.height > 0)
                {
                    SpriteMetaData smd = new SpriteMetaData();
                    smd.name = name + "." + layer.Name;
                    smd.rect = new Rect(
                        layer.Rect.x,
                        psd.RowCount - layer.Rect.y - layer.Rect.height,
                        layer.Rect.width,
                        layer.Rect.height);

                    foreach (SpriteMetaData s in tmpMeta)
                    {
                        if (smd.name == s.name)
                        {
                            smd.pivot     = s.pivot;
                            smd.border    = s.border;
                            smd.alignment = s.alignment;
                        }
                    }
                    sprMeta.Add(smd);
                }
            }
            texImp.spritesheet = sprMeta.ToArray();
        }
 void OnPostprocessTexture(Texture2D text)
 {
     ///Load PSD
     if (assetPath.ToLower().EndsWith(PSDUtils.psdImportSettings.psdSuffix + ".psd"))
     {
         PsdFile psd = PSDUtils.ImportPSD(assetPath);
         if (psd != null)
         {
             PSDUtils.CreatSpriteFromLayers(psd, assetImporter);
         }
         else
         {
             LogError("Can not read the PSD Atlass File: " + assetPath);
         }
     }
 }
        public PsdExportSettings(string path)
        {
            if (!path.ToUpper().EndsWith(".PSD"))
            {
                return;
            }

            FullFileName = path;
            ExportPath   = PsdSetting.Instance.DefaultImportPath;

            Psd      = new PsdFile(path, Encoding.Default);
            Filename = Path.GetFileNameWithoutExtension(path);

            ScaleBy          = 0;
            Pivot            = SpriteAlignment.Center;
            PixelsToUnitSize = 100f;
        }
Exemple #25
0
        public PsdExportSettings(Texture2D image)
        {
            string path = AssetDatabase.GetAssetPath(image);

            if (!path.ToUpper().EndsWith(".PSD"))
            {
                return;
            }

            Psd      = new PsdFile(path, Encoding.Default);
            Filename = Path.GetFileNameWithoutExtension(path);
            Image    = image;

            ScaleBy          = 0;
            Pivot            = SpriteAlignment.Center;
            PixelsToUnitSize = 100f;

            LoadMetaData();
        }
Exemple #26
0
        public InfoLayers(PsdFile psdFile, string key)
        {
            PsdFile = psdFile;

            switch (key)
            {
            // The key does not have to match the bit depth, but it does have to
            // be one of the known values.
            case "Layr":
            case "Lr16":
            case "Lr32":
                this.key = key;
                break;

            default:
                throw new PsdInvalidException(
                          $"{nameof(InfoLayers)} key must be Layr, Lr16, or Lr32.");
            }
        }
Exemple #27
0
        protected override Document OnLoad(System.IO.Stream input)
        {
            PsdFile psdFile = new PsdFile();

            psdFile.Load(input);

            Document document = new Document(psdFile.Columns, psdFile.Rows);

            if (psdFile.Resolution != null)
            {
                document.DpuUnit = MeasurementUnit.Inch;
                document.DpuX    = psdFile.Resolution.HRes;
                document.DpuY    = psdFile.Resolution.VRes;
            }

            if (psdFile.Layers.Count == 0)
            {
                BitmapLayer layer = ImageDecoderPdn.DecodeImage(psdFile);
                document.Layers.Add(layer);
            }
            else
            {
                PaintDotNet.Threading.PrivateThreadPool threadPool = new PaintDotNet.Threading.PrivateThreadPool();
                var layersList = new List <Layer>();
                foreach (PhotoshopFile.Layer l in psdFile.Layers)
                {
                    if (!l.Rect.IsEmpty)
                    {
                        layersList.Add(null);
                        LoadLayerContext llc          = new LoadLayerContext(l, document, BlendModeKeyToBlendOp(l), layersList, layersList.Count - 1);
                        WaitCallback     waitCallback = new WaitCallback(llc.LoadLayer);
                        threadPool.QueueUserWorkItem(waitCallback);
                    }
                }
                threadPool.Drain();

                foreach (var layer in layersList)
                {
                    document.Layers.Add(layer);
                }
            }
            return(document);
        }
Exemple #28
0
        private static List <PanelNode> GetLayer(Texture2D psdFile, string filter = "")
        {
            List <PanelNode>  PanelNodeList = new List <PanelNode> ();
            PsdExportSettings settings      = new PsdExportSettings(psdFile);
            PsdFileInfo       fileInfo      = new PsdFileInfo(settings.Psd);
            bool valid = (settings.Psd != null);

            if (valid)
            {
                settings.LoadLayers(fileInfo);
                PsdFile psd           = settings.Psd;
                int     layerIndexMin = 0;
                int     layerIndexMax = 0;
                for (int i = 0; i < psd.Layers.Count; i++)
                {
                    PSDLayerGroupInfo groupInfo = fileInfo.GetGroupByLayerIndex(i);
                    //Debug.Log (groupInfo.start + "-" + groupInfo.end + ":" + groupInfo.name);
                    if (groupInfo != null && !PanelNodeList.Exists(a => a.Name.Equals(groupInfo.name)))
                    {
                        PanelNode panelNode = new PanelNode(groupInfo.name);
                        panelNode.visible  = groupInfo.visible;
                        panelNode.idxStart = groupInfo.start;
                        panelNode.idxEnd   = groupInfo.end;
                        panelNode.isGroup  = true;
                        PanelNodeList.Add(panelNode);
                    }
                }

                for (int i = 0; i < fileInfo.LayerIndices.Length; i++)
                {
                    int       layerIndex = fileInfo.LayerIndices [i];
                    Layer     layer      = psd.Layers [layerIndex];
                    PanelNode panelNode  = new PanelNode(layer.Name);
                    panelNode.visible = layer.Visible;
                    panelNode.Index   = layerIndex;
                    panelNode.isGroup = false;
                    panelNode.layer   = layer;
                    PanelNodeList.Add(panelNode);
                }
                ArrangementNode(PanelNodeList);
            }
            return(PanelNodeList);
        }
        private void OnGUI()
        {
            EditorGUI.BeginChangeCheck();
            originTexture = (Texture2D)EditorGUILayout.ObjectField("psd", originTexture, typeof(Texture2D), false);

            if (originTexture == null)
            {
                originPsd = null;
                return;
            }

            if (EditorGUI.EndChangeCheck() || (originTexture != null && originPsd == null))
            {
                UpdateOriginTexture();
            }

            fontData = (Font)EditorGUILayout.ObjectField("font", fontData, typeof(Font), false);
            EditorGUILayout.Space();

            if (saveEditor != null)
            {
                saveEditor.Draw(position.position);
            }

            if (GUILayout.Button("Convert"))
            {
                GameObject canvasObj = GameObject.Find("Canvas");
                if (canvasObj == null)
                {
                    canvasObj = new GameObject("Canvas");
                    var canvas = canvasObj.AddComponent <Canvas>();
                    canvas.renderMode = RenderMode.ScreenSpaceOverlay;

                    var scalor = canvasObj.AddComponent <CanvasScaler>();
                    scalor.uiScaleMode         = CanvasScaler.ScaleMode.ScaleWithScreenSize;
                    scalor.referenceResolution = originSize;
                }

                Convert();
                UpdateOriginTexture();
            }
        }
Exemple #30
0
        public SaveAssetEditor(PsdFile psd, string assetSavePath)
        {
            this.assetSavePath = assetSavePath;

            foreach (var layer in psd.Layers)
            {
                if (layer.AdditionalInfo.Any(x => x is LayerSectionInfo))
                {
                    continue;
                }
                if (layer.AdditionalInfo.Any(x => x is TextLayerInfo))
                {
                    continue;
                }
                if (layer.Rect.width <= 0 || layer.Rect.height <= 0)
                {
                    continue;
                }
                if (layers.Any(x => x.layer.Name == layer.Name))
                {
                    continue;
                }

                var origin = EditorUtil.CreateTexture(layer);
                if (origin == null)
                {
                    continue;
                }

                var sprite = AssetDatabase.LoadAssetAtPath <Sprite>(EditorUtil.GetAssetPath(assetSavePath, layer.Name));
                layers.Add(new TempLayer
                {
                    layer         = layer,
                    originTexture = origin,
                    existTexture  = sprite,

                    overWrite = sprite == null,
                });
            }

            layers = layers.OrderBy(x => x.layer.Name).ToList();
        }