C#基础(三十六).dcm .png .jpg .bmp等与字节byte[]互转。图片文件头部标识。SaveFileDialog\OpenFileDialog可以存储或打开任意文件。

https://www.cnblogs.com/luxiaoxun/p/3378416.html

http://www.cnblogs.com/wifi/articles/3522773.html

https://blog.csdn.net/uiwgi/article/details/53201551

一、互转

  1.1、图片.png .jpg .bmp等与字节byte[]的互转

#region 字节与图片的互转
using System;
using System.Collections;
using System.Collections.Generic;
using System.Drawing;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace QueueSample
{
    class Program
    {
        static void Main(string[] args)
        {

            string path = @"C:\Users\lanmage2\Desktop\aaa.jpg";
            ImageConvertToByte(path);
            ImageConvertToByte(ImageConvertToByte(path));
            Console.ReadLine();
        }
        /// <summary>
        /// 图片转字节
        /// </summary>
        /// <param name="Path"></param>
        /// <returns></returns>
        static byte[] ImageConvertToByte(string Path)
        {
            FileStream fs = new FileStream(Path, FileMode.Open, FileAccess.Read);
            Byte[] btye2 = new byte[fs.Length];
            fs.Read(btye2, 0, Convert.ToInt32(fs.Length));
            fs.Close();
            return btye2;
        }

        /// <summary>
        /// 字节转图片
        /// </summary>
        /// <param name="ImageByte"></param>
        /// <returns></returns>
        static Image ImageConvertToByte(byte[] ImageByte)
        {
            System.IO.MemoryStream ms = new System.IO.MemoryStream(ImageByte);
            Image img = Image.FromStream(ms);
            img.Save(@"C:\Users\lanmage2\Desktop\aaa22", System.Drawing.Imaging.ImageFormat.Bmp);
            return img;
        }
    }
}

  1.2、.dcm/.raw等等文件与字节byte[]的互转 

医学上,我们往往需要将字节与.dcm等文件互相转换,其主要用到了System.Windows.Forms.SaveFileDialog。

#region .dcm与字节的互转
using System;
using System.Collections;
using System.Collections.Generic;
using System.Drawing;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks;

namespace QueueSample
{
    class Program
    {
      
        static void Main(string[] args)
        {

            string path = @"C:\Users\lanmage2\Desktop\11.dcm";
            ByteConvertToImage(ImageConvertToByte(path));
            Console.ReadLine();
        }
        /// <summary>
        /// 图片转字节
        /// </summary>
        /// <param name="Path"></param>
        /// <returns></returns>
        static byte[] ImageConvertToByte(string Path)
        {
            FileStream fs = new FileStream(Path, FileMode.Open, FileAccess.Read);
            Byte[] btye2 = new byte[fs.Length];
            fs.Read(btye2, 0, Convert.ToInt32(fs.Length));
            fs.Close();
            return btye2;
        }

        /// <summary>
        /// 字节转图片
        /// </summary>
        /// <param name="ImageByte"></param>
        /// <returns></returns>
        static void ByteConvertToImage(byte[] bytContent)
        {  
            System.Windows.Forms.SaveFileDialog save = new System.Windows.Forms.SaveFileDialog();//核心1
            save.Filter = "dcm文件|*.dcm";//筛选
            save.FileName = @"C:\Users\lanmage2\Desktop\22.dcm";//保存文件的名字
            App.Current.Dispatcher.Invoke((Action)delegate ()//STA问题自己百度解决吧。
            {
                if (save.ShowDialog() == System.Windows.Forms.DialogResult.OK)//打开对话框
                {
                    byte[] buffer = new byte[0];
                    buffer = bytContent;
                    System.IO.File.WriteAllBytes(save.FileName, buffer);//核心2
                }
            });
        }
    }
}
#endregion

1.3、打开文件

System.Windows.Forms.OpenFileDialog

      /// <summary>
        /// 点击加载一张Dicom图:主要用来测试
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void OpenDicom_Click(object sender, RoutedEventArgs e)
        {
            System.Windows.Forms.OpenFileDialog open = new System.Windows.Forms.OpenFileDialog();
            open.Filter = "DCM图像文件|*.dcm";
            open.RestoreDirectory = false;
            if (open.ShowDialog() == System.Windows.Forms.DialogResult.OK)
            {
                handle.PutImage(this.imageview, open.FileName, ref m_cDicomFile);
            }
            //适应窗口
            imageview.FtsImage();
            this.imageview.Invalidate();
            //隐藏视频监控窗口
            this.imgDisPlay.Visibility = Visibility.Hidden;
            this.host.Visibility = Visibility.Visible;
        }

二、可是我还想知道,不同格式图片转成字节后的数据结构是不是一样

     图片,都由一定的数据结构组成。于是,我想看看.png .jpg .bmp等转成字节后,数据结构是不是一样。显然,是不一样的。

参考https://blog.csdn.net/sj_wll/article/details/81075930

https://blog.csdn.net/u012611878/article/details/52215985

1、文件头部标识

      图片文件的格式结果中,在头部信息(一般都会在图片文件最开始的几个字节)中都会包含图片的格式信息。下面就列车常用的这几种格式图片的头部信息标识(十六进制)。
Png图片文件包括8字节:89 50 4E 47 0D 0A 1A 0A。即为 .PNG….。 
Jpg图片文件包括2字节:FF D8。
Gif图片文件包括6字节:47 49 46 38 39|37 61 。即为 GIF89(7)a。
Bmp图片文件包括2字节:42 4D。即为 BM。

 

2、改后缀并不能改变头部的格式

      我们不能单纯的用文件后缀名.png、.jpg、.jpeg、.gif、.bmp来区分图片格式,因为实际上我们可以直接修改图片后缀名,修改后缀名并不能修改图片的格式,图片还是保持它原来的格式。

3、我们来上面例子,来验证一下头部结构

3.1、.jpg

255对应了十六进制的FF,216对应了十六进制的D8。所以jpg图片的格式正确。

3.2、.png

137对应了十六进制的89,80对应了十六进制的50。所以png图片的格式正确。

3.3、.bmp

66对应了十六进制的42,77对应了十六进制的4D。所以bmp图片的格式正确。

3.4、.MemoryBmp和png一样

3.5、.GIf 

4、小结

同样的一张图片,经过下面操作后:

1、jpg转成png之后,字节长度由65183变成了115661

2、然后,png转成bmp之后,字节长度由115661变成了10627726。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

我爱AI

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值