首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

将InkCanvas保存到字节数组到文件时图像被损坏

的问题可能是由于保存和加载过程中的编码问题导致的。以下是一种可能的解决方案:

  1. 确保使用正确的图像编码格式进行保存和加载。常见的图像编码格式包括JPEG、PNG和BMP。根据你的需求选择合适的编码格式。
  2. 在保存InkCanvas为字节数组之前,将其转换为位图图像。可以使用InkCanvas的Render方法将其渲染为位图图像。
  3. 使用合适的图像编码器将位图图像保存为字节数组。例如,对于JPEG编码,可以使用JpegBitmapEncoder;对于PNG编码,可以使用PngBitmapEncoder。
  4. 在加载字节数组并还原InkCanvas时,确保使用正确的图像解码器进行解码。例如,对于JPEG编码,可以使用JpegBitmapDecoder;对于PNG编码,可以使用PngBitmapDecoder。

下面是一个示例代码片段,演示了如何保存和加载InkCanvas:

代码语言:csharp
复制
// 保存InkCanvas为字节数组
using (MemoryStream stream = new MemoryStream())
{
    RenderTargetBitmap bitmap = new RenderTargetBitmap((int)inkCanvas.ActualWidth, (int)inkCanvas.ActualHeight, 96, 96, PixelFormats.Default);
    bitmap.Render(inkCanvas);

    BitmapEncoder encoder = new PngBitmapEncoder(); // 使用PNG编码器
    encoder.Frames.Add(BitmapFrame.Create(bitmap));
    encoder.Save(stream);

    byte[] byteArray = stream.ToArray();

    // 将字节数组保存到文件
    File.WriteAllBytes("path/to/file.png", byteArray);
}

// 从文件加载字节数组并还原InkCanvas
byte[] byteArray = File.ReadAllBytes("path/to/file.png");

using (MemoryStream stream = new MemoryStream(byteArray))
{
    BitmapDecoder decoder = BitmapDecoder.Create(stream, BitmapCreateOptions.None, BitmapCacheOption.OnLoad);
    BitmapFrame frame = decoder.Frames[0];

    DrawingVisual visual = new DrawingVisual();
    using (DrawingContext context = visual.RenderOpen())
    {
        context.DrawImage(frame, new Rect(0, 0, frame.Width, frame.Height));
    }

    RenderTargetBitmap bitmap = new RenderTargetBitmap((int)frame.Width, (int)frame.Height, 96, 96, PixelFormats.Default);
    bitmap.Render(visual);

    inkCanvas.Strokes = new StrokeCollection();
    inkCanvas.Strokes.Add(new Stroke(new StylusPointCollection()));
    inkCanvas.Strokes = new StrokeCollection(bitmap.GetFlattenedPathGeometry().GetOutlinedPathGeometry());
}

这是一个基本的示例,你可以根据自己的需求进行调整和扩展。记得根据实际情况选择合适的图像编码格式和相关的编码器/解码器。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

WPF 尝试使用 WinML 做一个简单的手写数字识别应用

Learning 意味着这是和系统绑定的功能,想要使用此功能,要求使用 Win10 1809 或以上的系统版本 根据微软官方文档可以知道 WinML 底层里有依赖 DirectML 组件,从架构层级上看大概的关系如下...CPU 上运行 接下来我演示的代码是采用 WinRT 的方式调用 WinML 层。...快捷的安装 WindowsAppSDK 的方法是编辑 csproj 项目文件,编辑之后的项目文件内容大概如下 <PropertyGroup...版本之间的关系如下,详细请看 Windows 10 version history - Wikipedia 接下来下载大佬训练好的 mnist.onnx 模型文件,下载地址是 https://github.com...创建 SoftwareBitmap 可以从像素数组进行创建,获取 RenderTargetBitmap 的像素数组的方法可以是先开辟一个缓存空间,让 RenderTargetBitmap 像素数组写入缓存空间里面

48010
  • 深度学习的图像修复

    在数字世界中,它指的是应用复杂算法以替代图像数据中缺失或者损坏部分。 在数字效果图像复原,图像编码和传输的应用中,图像修复已经被广泛地研究。...有两种类型的信息需要关注: 情景信息 感知信息 传统修复 传统上,图像修复可以使用基于扩散方法来处理,这种方法局部结构传播到位置部分,或者基于示例的方法,每一次构建缺失部分的一个像素点(块)同时保持和周围像素点的一致性...image.png 当缺失部分很大,这些方法会失效,因此需要一个额外的部件提供合理的想象力(来自机器的幻觉)。这些附加的信息可能是由自然图像的高阶模型提供,例如由深度神经网络计算的那些。...在监督图像分类中,每个图像都有一个特定的标签,并且神经网络通过一连串的基本操作运算来学习图像标签之间的映射。...Total Variation (TV) norm由于具有边性,在反问题如去噪、超分辨率等中被广泛用作正则化器。 不同技术的比较 image.png 原始图像被特意标出来检验性能。

    1.1K30

    UWP 手绘视频创作工具技术分享系列

    PNG/JPEG/BMP 等位图的绘制     PNG/JPEG/BMP 等图片格式,有着不同的压缩和编码格式,但因为都属于位图,所以组成元素都是像素,由一个 width * height 的长度的数组来存储每个像素点的像素值...因为位图是没有路径的,默认我们没办法像 SVG 那样绘制出它的创作过程, 所以我们选择了一种相对简单的渲染绘制方法:从图片的一个角绘制另一个角,比如左上角右下角,保持稳定的速度和方向,这样就由了下图的绘制过程...手绘视频中插入视频文件     手绘视频中插入视频,可以让表现形式变得更加丰富。...下面其中一种场景:     对于我们在程序中的处理,在操作和预览,更多的直接利用了系统的 MediaElementPlayer 播放器。...而在导出视频,需要对插入视频的帧做单独处理,还有对视频的音轨做处理。 ? ? 7. 视频的生成和导出     在上面的主要操作完成后,我们需要把它导出成一个视频文件,如 MP4、WMV。

    1.3K110

    详解Raid级别和知识点

    像被用于RAID 1和 RAID 10。镜像会自动备份数据,在RAID 1中,它会保存相同的内容其他盘上。 热备份只是我们的服务器上的一个备用驱动器,它可以自动更换发生故障的驱动器。...为了能跨越数组里的所有磁盘来写入数据及校验码信息,RAID 5设定最少需要三个磁盘,因此在这种情况下,会有1/3的磁盘容量会被备份校验码占用而无法使用,当有四个磁盘,则需要1/4的容量作为备份,才能让最坏情况的发生率降到最低...Raid5特点: 性能卓越 读速度非常好 写速度处于平均水准,如果我们不使用硬件 RAID 控制器,写速度缓慢 从所有驱动器的奇偶校验信息中重建 完全容错 1个磁盘空间将用于奇偶校验 可以被用在文件服务器...当我逻辑卷上写数据,它会使用镜像和条带的方式数据保存到4个驱动器上。 如果我在 RAID 10 上写入数据“TECMINT”,数据将使用如下方式保存。...这样可以每个数据复制另外的磁盘。 同时它将使用 RAID 0 方式写入数据,遵循“T”写入第一组盘,“E”写入第二组盘。再次“C”写入第一组盘,“M”第二组盘。

    96220

    利用TFRecords存储于读取带标签的图片

    我们可以写一段代码获取你的数据, 数据填入Example协议内存块(protocol buffer),协议内存块序列化为一个字符串, 并且通过tf.python_io.TFRecordWriter...写入TFRecords文件。...数据集之所以被视为多类分类数据,是因为狗会被分类为单一品种,而非多个品种的混合, 在现实世界中,当预测狗的品种是,多标签解决方案通常较为有效,因为他们能够同时匹配属于多个品种的狗""" """ 这段代码中,图像被加载到内存中并被转换为字节数组...序列化是一种内存对象转化为可安全传输到某种文件的格式....上面序列化的样本现在被保存为一种可被加载的格式,并可被反序列化为这里的样本格式 由于图像被保存为TFRecord文件,可以被再次从TFRecord文件加载.这样比图像及其标签分开加载会节省一些时间

    1.2K10

    Redis持久化机制上手

    图上标注出两个时间点的两个数据库切片,RDB持久化做的事情就是顺着绿色箭头的方向数据库状态的“切片”以RDB文件的形式保存到磁盘中。 ?...“EOF”常量的长度为1字节,是 RDB文件正文结束的标识,当载入程序读取到个值的,就意味着数据库的所有键值对都已经加载完毕了。...Redis服务器在载入RDB文件,会将载入数据所计算出的校验和与check_sum所记录的校验和进行对比,以此来判断RDB文件是否损坏。...Redis Server接受到命令以后,当前数据库快照保存到RDB文件中。...最终,完成AOF重写操作以后“新AOF文件”写入“旧AOF文件”中完成AOF重写。 ? 6 AOF重写流程 AOF配置重写 实际上是通过AOF的配置文件中的配置值来确定重写的时机。

    51520

    Hadoop RAID Node 调研

    HDFS Raid包含几个软件模块: DRFS client:为应用提供访问DRFS中文件的接口,当在读文件能透明地恢复任意损坏或丢失的块; RaidNode:为存储在DRFS的所有数据文件创建和维护...值得注意的是,DRFS client在读到损坏文件重新计算丢失的块,并不会将这些丢失的块存到文件系统中,它在完成应用的请求后将其忽略。...当发现一个有丢失或损坏,这些块会被重新计算并放回文件系统中。 从Namenode获得损坏文件列表,source文件通过“解码”来重新构造,parity文件通过“编码”来重新构造。...当在编码,ErasureCode取几个source字节并生成一些parity字节。当在解码,ErasureCode通过剩余的souce字节和parity字节来生成丢失的字节。...使用Reed-Solomon,source文件的副本数能减少1而不造成数据丢失。1个块只有1个副本的不足是只能通过1个固定的机器来读取1个块,减少了并行性。

    66810

    使用 WPADPAC 和 JScript在win11中进行远程代码执行3

    513 元素添加到前 1000 个对象,导致 1000 次分配 8192 字节哈希表。 使用长度为 300 和 170 个元素的数组触发 Array.sort。...在同一个 toString() 方法中,还会向数组添加更多元素,这将导致它超出范围。 5 显示了围绕排序缓冲区地址(红线)的堆可视化。...它们的特别之处在于它们的最后 8 个字节中分别包含数字 5、8 和 0x400C。 溢出后损坏对象的状态如图 6 所示。 [lv4sufiaig.png] 6:溢出后的对象状态。...例如语句 损坏的对象index2 = 损坏的对象index4; 效果是变量 1 的类型更改为字符串 (8),而变量 1 的所有其他字段保持不变。...将它们捆绑在一起 当 WPAD 服务查询 PAC 文件,我们提供利用 WPAD 服务并运行 WinExec 以删除并执行权限提升二进制文件的漏洞利用文件

    2K310

    Hadoop重点难点:Hadoop IO压缩序列化

    序列化 序列化是指结构化对象转化为字节流以便在网络上传输或写到磁盘进行永久存储的过程。反序列化是指字节流转回结构化对象的逆过程。...例如,长度为2的字节数组包含数值3和5,序列化形式为一个4字节的整数(00000002)和该数组中的两个字节(03和05) NullWritable NullWritable 是 writable 的特殊类型...Serialization 对象定义了从类型 Serializer 实例(将对象转换为字节流)和 Deserializer 实例(字节流转换为对象)的映射方式。...完整性 检测数据是否损坏的常见措施是,在数据第一次引入系统时计算校验和并在数据通过一个不可靠的通道进行传输再次计算校验和,这样就能发现数据是否损坏,如果计算所得的新校验和和原来的校验和不匹配,我们就认为数据已损坏...namenode 这个数据块复本标记为已损坏,这样它不再将客户端处理请求直接发送到这个节点,或尝试这个复本复制另一个 datanode 。

    94010

    Hadoop重点难点:Hadoop IO压缩序列化

    序列化 序列化是指结构化对象转化为字节流以便在网络上传输或写到磁盘进行永久存储的过程。反序列化是指字节流转回结构化对象的逆过程。...例如,长度为2的字节数组包含数值3和5,序列化形式为一个4字节的整数(00000002)和该数组中的两个字节(03和05) NullWritable NullWritable 是 writable 的特殊类型...Serialization 对象定义了从类型 Serializer 实例(将对象转换为字节流)和 Deserializer 实例(字节流转换为对象)的映射方式。...完整性 检测数据是否损坏的常见措施是,在数据第一次引入系统时计算校验和并在数据通过一个不可靠的通道进行传输再次计算校验和,这样就能发现数据是否损坏,如果计算所得的新校验和和原来的校验和不匹配,我们就认为数据已损坏...namenode 这个数据块复本标记为已损坏,这样它不再将客户端处理请求直接发送到这个节点,或尝试这个复本复制另一个 datanode 。

    98030

    Microsoft Tech Summit 2018 课程简述:利用 Windows 新特性开发出更好的手绘视频应用

    , 同时增加了模板的支持,Autodraw 和智能配音的支持;在这之后,半年的时间没有大的更新发布,因为我们在做一次大的改版,终于在 9月份,4.0 版本发布。...而在这三年间中,也经历了多次重大更新,从最早的1507到现在的1809,Windows 10 SDK 也从 10240 更新到了17763。...我们对位图的处理方式,可以实现简单的手绘效果,也就是从左上角右下角来匀速涂抹出图片;也可以做进一步的处理,比如支持用户在位图的背景上做进一步的线条勾勒,保存为 SVG,绘制是背景被勾勒出来的效果;...该平台支持数字化器输入捕获为墨迹数据、生成墨迹数据、管理墨迹数据、在输出设备上以笔划墨迹形式呈现墨迹数据以及通过手写识别将墨迹转换为文本。...Windows Machine Learning     2018 Windows Developer Day 发布,利用 Windows Machine Learning,开发者可以把模型集成 Windows

    1.2K30

    C#中Image , Bitmap 和 BitmapData

    Scan0属性:被锁定数组的首字节地址,如果整个图像被锁定,则是图像的第一个字节地址. 5. Stride属性:步幅,也称为扫描宽度....bmpData的内存起始位置 17 int scanBytes = stride * height;// 用stride宽度,表示这是内存区域的大小 18 //// 下面把原始的显示大小字节数组转换为内存中实际存放的字节数组...} 28 posScan += offset; //行扫描结束,要将目标位置指针移过那段“间隙” 29 } 30 //// 用Marshal的Copy方法,刚才得到的内存字节数组复制...同样,我们也可以根据图片得到他的灰度数组 1 //8位位得到除去文件头信息的一位灰度数组 2 3 4 BitmapData bmpData = map.LockBits(new System.Drawing.Rectangle...的内存起始位置 13 14 int scanBytes = stride * map.Height;// 用stride宽度,表示这是内存区域的大小 15 16 //// 下面把原始的显示大小字节数组转换为内存中实际存放的字节数组

    2.8K20

    如何全面监控 iOS 千奇百怪的崩溃

    ▐ 2.1 数组 数据越界,在取数据索引越界,App 会发生崩溃 就是给数组添加了 nil 会崩溃 ▐ 2.2 字典 字典 value 传的 nil 也会发成崩溃 ▐ 2.3 多线程 在子线程中进行...一般,在退后台你都会把关键业务数据保存在内存中,如果保存过程中出现了崩溃就会丢失或损坏关键数据,进而数据损坏又会导致应用不可用。这种关键数据的损坏会给用户带来巨大的损失。...进程挂起后所有线程都会暂停,不管这个线程是文件读写还是内存读写都会被暂停。但是,数据读写过程无法暂停只能被中断,中断时数据读写异常而且容易损坏文件,所以系统会选择主动杀掉 App 进程。...采用 Background Task 方式,我们可以根据beginBackgroundTaskWithExpirationHandler 会让后台活3分钟这个阈值,先设置一个计时器,在接近3分钟判断后台程序是否还在执行...同时,每个崩溃也都有自己的崩溃趋势、iOS 系统分布等信息,来辅助开发者跟踪崩溃修复效果。

    2.1K20

    hbase解决海量图片存储

    代码1:用HCoIumnDescriptor数据块限制调整为512KB 1 配置代码 上述基于HBase的海量图片存储技术具有如下优点: (1)通过图片属性信息与图片内容存储一个大表中...2 HFile Cell的Key-Value存储结构 可见,(1)无校验码设计,导致存储图片数据的正确性无法验证;(2)Key-Value字节数组没有进行对齐,影响读写效率。...校验和为8个字节(64位)。通过补白部分,使每个Key-Value字节数组大小为8字节的整数倍,从而更加适合64位系统,如图3所示。做了上述调整后,在读写数据都要进行相应改变。...在写数据,首先对Value域进行校验和计算,并写入校验和域;然后,计算Key-Value字节数组总大小,如果不是8的整数倍,则在补白域存储一定数量的0x00字节,使之总大小为8的整数倍。...四、结束语 本文设计并实现了基于HBase的海量图片存储技术方案,实现了系统层小文件合并、全局名字空间、并具有良好的通用性;通过对HFile Key-Value字节数组结构的完善,实现了图片读取的自动纠错

    2.6K20

    温故Linux后端编程(四):膜拜《TCPIP 卷一》

    如果一方的应用程序先传 10字节,又传20字节,再传50字节,连接的另一方无法了解发方每次发送了多少字节。收方可以分 4次接收这80个字节,每次接收 20字节。... 18-3中的报文段4发起终止连接,它由Telnet客户端关闭连接发出。它将导致TCP客户端发送一个FIN,用来关闭从客户服务器的数据传送。...和SYN一样,一个FIN占用一个序号。同时 TCP服务器还向应用程序(即丢弃服务器)传送一个文件结束符。...服务器在两小时以后活定时器复位。 如果在两小时定时器到时间之前有应用程序的通信量通过此连接,则定时器在交换数据后的未来2小再复位。 2) 客户主机已经崩溃,并且关闭或者正在重新启动。...这个值通常可以改变,但是活间隔时间是系统级的变量,因此改变它会影响所有使用该功能的用户。 ---- 这儿吧

    62610

    Photoshop2023中文正式版免费下载安装 安装教程

    2022年4月(23.3版)知识兔发布   UXP 块保存功能,与保存到云插页式广告相关   复制链接层不会知识兔持状态层   以前保存的文件以某种颜色的打开层调整 - MachinePrefs.psp...原因   打开文件时调试声明 - 知识兔在进入编辑>大小时,您不能重新关闭对话框大小   放置的链接 PNG 文件知识兔在转换和碰撞不正确表达   调整曲线用户重做不会让终端到达    .tif...其他程序错误,无法完成您的请求 - 在 PS   回归 > 不正确的切片位知识兔置和不稳定性   安装了 Silverfast 插件的异常错误,无法完成请求   Export As - Scale All 序号知识兔添加到文件名...  编辑功能会在关闭PDF另存为中层的图层   ps在23.2.0版本的.知识兔psd文件中打开崩溃   Ps 在调整位置发生知识兔危险   创建新文档,从文件中复制时会生成 JSON 错误   ...  [Win] 机器学习车知识兔祸/损坏损坏   [Mac] Photoshop 23.2 在启动崩溃开始安装Photoshop2023中文正式版免费下载知识兔下载安装包后解压,打开【set-up】

    2.8K50

    【Java 基础篇】Java字节打印流详解:处理二进制数据的利器

    在Java中,字节打印流是用于字节数据写入输出目标(通常是文件)的工具。它可以方便地各种数据类型(如整数、浮点数、字符等)以字节形式写入输出流中。...这对于在内存中构建字节数据,然后将其保存到文件中非常有用。你可以在构造函数中提供一个初始大小的字节数组,如果数据量超过了数组的容量,它会自动扩展。...,并最后数据保存到一个字节数组中。...toByteArray():数据保存到一个字节数组中。 close():关闭流。 这些方法使得我们可以方便地读写字节数据并进行操作。 实际应用示例 1....复制文件 字节打印流可用于创建一个程序,用于复制一个文件的内容另一个文件。你可以使用FileInputStream读取源文件的内容,然后使用FileOutputStream内容写入目标文件

    35230

    Java IO详解(三)------字节输入输出流

    //3、具体的 IO 操作(数据写入文件 a.txt 中) /** * void write(int b):把一个字节写入文件中 * void write(byte[]...b):把数组b 中的所有字节写入文件中 * void write(byte[] b,int off,int len):把数组b 中的从 off 索引开始的 len 个字节写入文件中...*/ out.write(65); // A 写入文件中 out.write("Aa".getBytes()); // Aa 写入文件中 out.write("ABCDEFG".getBytes...读取多个字节,并保存到数组 b 中,从数组 b 的索引为 0 的位置开始存储,返回读取了几个字节 * int read(byte[] b,int off,int len):读取多个字节,并存储数组...文件中的数据的第一个字节 System.out.println((char)data1); //A //int read(byte[] b):读取多个字节存到数组b 中 byte[] buffer

    767100
    领券