• C#与Python 通过共享内存实现tiff图像交互


    第一种方法:共享内存只存tiff图像里的灰度信息

    using System;
    using System.IO;
    using System.IO.MemoryMappedFiles;
    using System.Runtime.InteropServices;
    using System.Windows;
    using System.Windows.Media.Imaging;
    namespace WpfApp1
    {
        /// <summary>
        /// MainWindow.xaml 的交互逻辑
        /// </summary>
        public partial class MainWindow : Window
        {
            public MainWindow()
            {
                InitializeComponent();
            }
            private void Button_Click(object sender, RoutedEventArgs e)
            {
                try
                {
                    Stream imageStreamSource = new FileStream("test.tif", FileMode.Open, FileAccess.Read, FileShare.Read);
                    var decoder = new TiffBitmapDecoder(imageStreamSource, BitmapCreateOptions.PreservePixelFormat, BitmapCacheOption.Default);
                    BitmapSource bitmapSource = decoder.Frames[0];
                    Int32 PixelHeight = bitmapSource.PixelHeight; // 图像高度
                    Int32 PixelWidth = bitmapSource.PixelWidth;   // 图像宽度
                    Int32 Stride = (PixelWidth * bitmapSource.Format.BitsPerPixel + 7) / 8;  // 跨距宽度
                    UInt16[] imgBuffer = new UInt16[PixelHeight * PixelWidth];//创建图像灰度值数据所需的数组
                    bitmapSource.CopyPixels(imgBuffer, Stride, 0);//读取灰度值到数组
                    //16位灰度转化成8位
                    byte[] bytes = new byte[2048 * 2048 * 2];
                    IntPtr intptr = Marshal.UnsafeAddrOfPinnedArrayElement(imgBuffer, 0);
                    Marshal.Copy(intptr, bytes, 0, 2048 * 2048 * 2);
                    //向共享内存写入灰度值数据
                    var mmf = MemoryMappedFile.CreateOrOpen("test1", bytes.Length, MemoryMappedFileAccess.ReadWrite);
                    var viewAccessor = mmf.CreateViewAccessor(0, bytes.Length);
                    viewAccessor.Write(0, bytes.Length); ;
                    viewAccessor.WriteArray<byte>(0, bytes, 0, bytes.Length);
                    MessageBox.Show("write ok" + bytes.Length.ToString());
                }
                catch (System.Exception s)
                {
                    MessageBox.Show(s.Message);
                }
            }
        }
    }
    C# 向共享内存只写入tiff灰度数据
    #!/usr/bin/env python
    # _*_ coding:utf-8 _*_
    import contextlib
    import mmap
    import numpy as np
    
    # tif图像像素宽度2048高度2048,位深16bit,故一张图像的字节大小为2048*2048*2
    byteSize = 2048 * 2048 * 2
    
    with contextlib.closing(mmap.mmap(-1, byteSize, tagname="test1", access=mmap.ACCESS_READ)) as m:
        m.tell()
        s = m.read()
        a = np.frombuffer(s, dtype=np.uint16).reshape(2048, 2048)  # 转换为二维元组
        print(a)
    Python读取灰度数据

     第二种方法:共享内存存放tiff图像所有byte数据(即灰度数据前加入照片头文件信息)

    using System.IO.MemoryMappedFiles;
    using System.Windows;
    namespace WpfApp1
    {
        /// <summary>
        /// MainWindow.xaml 的交互逻辑
        /// </summary>
        public partial class MainWindow : Window
        {
            public MainWindow()
            {
                InitializeComponent();
            }
            private void Button_Click(object sender, RoutedEventArgs e)
            {
                try
                {
                    byte[] bytes = System.IO.File.ReadAllBytes("test.tif");//读取Tiff图像所有Byte字节数据
                    //写入共享内存
                    var mmf = MemoryMappedFile.CreateOrOpen("test1", bytes.Length, MemoryMappedFileAccess.ReadWrite);
                    var viewAccessor = mmf.CreateViewAccessor(0, bytes.Length);
                    viewAccessor.Write(0, bytes.Length); ;
                    viewAccessor.WriteArray<byte>(0, bytes, 0, bytes.Length);
                    MessageBox.Show("write ok" + bytes.Length.ToString());
                }
                catch (System.Exception s)
                {
                    MessageBox.Show(s.Message);
                }
            }
        }
    }
    C# 向共享内存写入tiff所有字节数据
    #!/usr/bin/env python
    # _*_ coding:utf-8 _*_
    import mmap
    
    import cv2
    import numpy as np
    
    byteSize = 8406200  # 2048*2048 16位的tif图像未经压缩保存后的字节大小固定为8406200,压缩后的tif图像字节大小不固定
    
    f = mmap.mmap(0, byteSize, 'test1', mmap.ACCESS_READ)
    img = cv2.imdecode(np.frombuffer(f, np.uint16), -1)
    print('断点')
    Python 用opencv读取共享tif图像数据
  • 相关阅读:
    List<T>Find方法,FindAll方法,Contains方法,Equals方法
    C#SerialPort如何读取串口数据并显示在TextBox上
    49、css属性相关
    40、协程
    45、mysql 储存过程
    37、进程之间的通信
    38、线程及其方法
    39、多线程和线程池
    33、验证客户端的合法性、socketserver模块
    32、黏包的解决方式、struct模块
  • 原文地址:https://www.cnblogs.com/lizhiqiang0204/p/15904984.html
Copyright © 2020-2023  润新知