⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 psf.cs

📁 一个C#开发的类似PHOTOSHOP的软件,用到了很多图形算法.
💻 CS
字号:
using System;
using System.Drawing;
using System.Drawing.Imaging;
using PhotoSprite.ImageProcessing;

namespace PhotoSprite.ImageFormat
{
  /// <summary>
  /// PhotoSprite 图像格式类
  /// </summary>
  public class PsfFormat : ImageInfo
  {
    /// <summary>
    /// 按 PhotoSprite 图像格式标准打开 PSF 图像文件
    /// </summary>
    /// <param name="srcFile">PSF 文件名</param>
    /// <returns></returns>
    public Bitmap Open(string srcFile)
    {
      // 打开图像文件
      System.IO.FileStream myFS = new System.IO.FileStream(srcFile,
        System.IO.FileMode.Open, System.IO.FileAccess.Read);

      // 文件头信息缓冲区
      byte[] HeaderBuffer = new byte[9];

      // 读取文件头信息
      myFS.Read(HeaderBuffer, 0, 9);

      // 获取图像识别标记
      string Mark = "";
      Mark += (char)HeaderBuffer[0];
      Mark += (char)HeaderBuffer[1];
      Mark += (char)HeaderBuffer[2];

      // 获取版本号
      byte Version = HeaderBuffer[3];

      // 获取图像宽高
      int width = HeaderBuffer[4] * 256 + HeaderBuffer[5];
      int height = HeaderBuffer[6] * 256 + HeaderBuffer[7];

      // 图像数据缓冲区
      byte[] DataBuffer = new byte[width * height * BPP];
      int pDataBuffer = 0;
      int LenDataBuffer = (int)myFS.Length - 9;

      // 读取图像数据内容
      myFS.Read(DataBuffer, 0, LenDataBuffer);

      myFS.Close();

      // 下面将文件流转换为图像位图流
      Bitmap b = new Bitmap(width, height);

      // 如果是不可识别版本,则返回一空白图像
      if (Mark != "PSF" && Version != 1) return b;

      BitmapData bmData = b.LockBits(new Rectangle(0, 0, width, height),
        ImageLockMode.WriteOnly, PixelFormat.Format32bppArgb);
      int stride = bmData.Stride;
      System.IntPtr scan0 = bmData.Scan0;
      int offset = stride - width * BPP;

      unsafe
      {
        byte* p = (byte*)scan0;

        for (int y = 0; y < height; y++)
        {
          for (int x = 0; x < width; x++)
          {
            p[3] = DataBuffer[pDataBuffer++]; // A
            p[2] = DataBuffer[pDataBuffer++]; // R
            p[1] = DataBuffer[pDataBuffer++]; // G
            p[0] = DataBuffer[pDataBuffer++]; // B

            p += BPP;
          } //  x
          p += offset;
        } // y
      }

      b.UnlockBits(bmData);

      return b;
    } // end of Open


    /// <summary>
    /// 按 PhotoSprite 图像格式标准保存 PSF 图像文件
    /// </summary>
    /// <param name="b">位图流</param>
    /// <param name="dstFile">目标文件名</param>
    /// <returns></returns>
    public bool Save(Bitmap b, string dstFile)
    {
      bool isSaveOK = true;

      int width = b.Width;
      int height = b.Height;

      // 图像数据缓冲区
      byte[] DataBuffer = new byte[width * height * BPP];
      int pDataBuffer = 0;

      BitmapData bmData = b.LockBits(new Rectangle(0, 0, width, height),
        ImageLockMode.ReadOnly, PixelFormat.Format32bppArgb);
      int stride = bmData.Stride;
      System.IntPtr scan0 = bmData.Scan0;
      int offset = stride - width * BPP;

      unsafe
      {
        byte* p = (byte*)scan0;

        for (int y = 0; y < height; y++)
        {
          for (int x = 0; x < width; x++)
          {
            DataBuffer[pDataBuffer++] = p[3]; // A
            DataBuffer[pDataBuffer++] = p[2]; // R
            DataBuffer[pDataBuffer++] = p[1]; // G
            DataBuffer[pDataBuffer++] = p[0]; // B

            p += BPP;
          } //  x
          p += offset;
        } // y
      }

      b.UnlockBits(bmData);

      // 文件头信息缓冲区
      byte[] HeaderBuffer = new byte[9];
      HeaderBuffer[0] = (byte)'P';
      HeaderBuffer[1] = (byte)'S';
      HeaderBuffer[2] = (byte)'F';
      HeaderBuffer[3] = 1;    // 版本号
      HeaderBuffer[4] = (byte)(width / 256);
      HeaderBuffer[5] = (byte)(width % 256);
      HeaderBuffer[6] = (byte)(height / 256);
      HeaderBuffer[7] = (byte)(height % 256);
      HeaderBuffer[8] = 0xFF; // alpha 标记

      try
      {
        // 开始写 PSF 格式文件
        System.IO.FileStream myFS = new System.IO.FileStream(dstFile,
          System.IO.FileMode.Create, System.IO.FileAccess.Write);

        // 写入文件头信息
        myFS.Write(HeaderBuffer, 0, 9);

        // 写入图像数据内容
        myFS.Write(DataBuffer, 0, pDataBuffer);

        myFS.Close();
      }
      catch
      {
        isSaveOK = false;
      }

      return isSaveOK;
    } // end of Save


  }
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -