在麒麟系统上利用VSCODE和C#实现高效图片处理:SkiaSharp实战指南

银河麒麟桌面操作系统V10上 安装vscode 阅读详情

1. 为什么要在麒麟系统上搞C#图片处理?

你可能觉得有点奇怪,麒麟系统,听起来是Linux的世界,C#不是微软家的吗?这俩能凑一块?没错,以前我也这么想。但自从.NET Core(现在叫.NET)横空出世,C#就彻底跨平台了,在Linux上跑得比兔子还快。我在麒麟系统上做开发有段时间了,最开始处理图片也头疼,System.Drawing在跨平台环境下就是个“坑”,官方都不推荐在非Windows上用。这时候,SkiaSharp就闪亮登场了。

SkiaSharp是什么?简单说,它是谷歌那个强大图形引擎Skia的.NET封装。Skia是安卓系统、Chrome浏览器、Flutter框架的底层绘图引擎,性能强悍,跨平台支持一流。用SkiaSharp来处理图片,就像给C#程序装上了一颗来自谷歌的“图形心脏”,在麒麟系统上处理图片缩放、裁剪、格式转换、加水印,那叫一个流畅。实测下来,处理速度比一些老牌库快不少,而且内存占用也更友好。

所以,这个组合非常适合谁呢?首先,就是那些原本用C#在Windows上开发,现在业务需要迁移或适配到国产麒麟系统的团队,图片处理模块不用重写,平滑过渡。其次,是喜欢C#语言优雅和.NET生态,但又需要在Linux环境下进行高性能图形处理的开发者。最后,像我们这种经常需要从硬件(比如读卡器、摄像头)获取字节流数据,然后快速转成图片保存或分析的场景,SkiaSharp更是得心应手。接下来,我就带你从零开始,在麒麟系统上用VS Code和C#,把这条路走通。

2. 环境准备与SkiaSharp安装避坑指南

工欲善其事,必先利其器。在麒麟系统上搭建C#开发环境,其实比想象中简单。

2.1 搭建你的麒麟系统C#开发环境

首先,确保你的麒麟系统已经安装了.NET SDK。打开终端,输入 dotnet --version 看看。如果没有,去微软官网下载对应麒麟系统架构(通常是x64或arm64)的.NET SDK安装包进行安装,或者通过包管理器安装,这里不赘述。我建议安装最新的长期支持(LTS)版本,比如.NET 8,稳定性有保障。

接着是VS Code。从官网下载.deb包安装即可。安装后,必须安装两个扩展:C#(由Microsoft发布)和 C# Dev Kit。后者是微软新出的开发套件,提供了更强大的项目管理、测试和调试体验,强烈建议装上。装好之后,用VS Code打开一个空文件夹,在终端里用 dotnet new console -n ImageProcessor 创建一个新的控制台项目,我们的实战就从这里开始。

2.2 安装SkiaSharp:一步一坑,我帮你填平

进入项目目录,现在我们来安装SkiaSharp。原始文章给的方法是对的,但有些细节没展开,我踩过的坑你得避开。

首先,运行安装命令:

dotnet add package SkiaSharp

这个命令会自动拉取最新稳定版的SkiaSharp及其依赖。安装完成后,你可以用 dotnet list package 查看,但原始文章里用 grep 过滤,更直接。

第一个大坑来了:原生依赖。 SkiaSharp底层依赖一些本地库(Native Libraries)。在Windows上,这些库通常被打包好了;但在Linux上,特别是麒麟这种发行版,可能需要单独处理。这就是为什么原始文章提到了 SkiaSharp.NativeAssets.Linux.NoDependencies 这个包。这个包的作用是提供Linux下Skia所需的所有原生库,并且是“无依赖”的静态链接版本,避免了你在系统里到处找.so文件的麻烦。

但是,不要一上来就装这个包! 这是我的经验。先只安装SkiaSharp,然后写个简单的解码图片代码试试。因为高版本的SkiaSharp(2.88+)有时已经包含了必要的本地资产。如果运行时报错,提示找不到 libSkiaSharp 之类的,再回头来安装这个NativeAssets包。

如果需要安装,务必注意版本对齐!这是第二个坑。SkiaSharp主包和NativeAssets包的版本必须严格一致。比如你安装的SkiaSharp是2.88.8,那么NativeAssets包也要指定同样的版本:

dotnet add package SkiaSharp.NativeAssets.Linux.NoDependencies --version 2.88.8

版本不匹配会导致运行时各种诡异的异常,提示信息可能还不直观,我当初在这浪费了好几个小时。

2.3 配置项目文件:锁死版本,杜绝调试噩梦

包安装好后,打开你的 .csproj 项目文件。你会发现里面已经多了SkiaSharp的引用。我强烈建议你按照原始文章的方法,手动把它整理成下面这样:

<ItemGroup>
  <PackageReference Include="SkiaSharp" Version="2.88.8" />
  <PackageReference Include="SkiaSharp.NativeAssets.Linux.NoDependencies" Version="2.88.8" />
</ItemGroup>

为什么要手动写?两个原因。第一,锁定版本。避免将来因为自动升级导致包版本不一致,特别是团队协作时,能保证所有人的环境一致。第二,确保VS Code调试时能找到库。VS Code的C#调试器有时对隐式传递的依赖解析不够智能,显式声明这两个包可以最大程度避免“找不到文件或程序集”的错误。

这里有个小技巧:你可以把 Version="2.88.8" 中的版本号先去掉,让VS Code的智能提示给你列出可用的最新版本,然后再填回去。这样既能用上新特性,又能保持稳定。

3. 核心实战:从字节流到图片文件的完整流程

环境配好了,包也齐了,现在我们来干正事:处理图片数据。在实际项目中,图片数据来源五花八门——可能是网络下载的字节流、硬件设备(如摄像头、读卡器)直接读取的二进制数据,或者是数据库里存储的Blob字段。它们的本质都是一个 byte[] 数组。我们的任务就是把这个“黑乎乎”的字节数组,变成可视的图片文件。

3.1 理解SKBitmap:SkiaSharp中的图片核心

在SkiaSharp里,SKBitmap 类是核心中的核心,它就相当于System.Drawing里的 Bitmap。你可以把它理解成一块内存中的画布,里面存储了所有像素点的颜色信息。我们处理图片的几乎所有操作(读取、修改、保存)都围绕它进行。

SKBitmap 的强大之处在于它的跨平台和性能。它直接操作内存中的像素数据,不依赖任何特定的操作系统图形接口。从字节数组创建 SKBitmap 非常简单,使用静态方法 SKBitmap.Decode(byte[] data) 即可。这个方法会自动识别图片格式(JPEG, PNG, WEBP, BMP等),并解码生成一个 SKBitmap 对象。如果字节数组不是有效的图片数据,它会返回 null,所以一定要做判空处理,这是写出健壮代码的第一步。

3.2 代码逐行解析:安全地将byte[]保存为图片

下面,我结合原始文章的代码片段,给你展开一个更健壮、更完整的示例,并加上详细注释:

using SkiaSharp;
using System.IO;

// 假设这是你的业务方法,iRtnVal是某个硬件操作的返回码
if (iRtnVal == 1)
{
    // 1. 模拟从硬件(如读卡器)获取图片字节数据
    // 实际项目中,这里替换为你的硬件API调用,比如 CV100Gen.GetBMPData(...)
    byte[] photoByte = new byte[40960];
    int photoLength = 40960;
    // 假设这个调用填充了 photoByte 数组,并更新了 photoLength 为实际数据长度
    // CV100Gen.GetBMPData(ref photoByte[0], ref photoLength);

    // 2. 关键步骤:解码字节数组为SKBitmap
    // 使用 using 语句确保 SKBitmap 资源被及时释放,避免内存泄漏
    using (SKBitmap photoBitMap = SKBitmap.Decode(photoByte))
    {
        // 一定要检查解码是否成功!
        if (photoBitMap == null)
        {
            Console.WriteLine("错误:无法解码图片数据,可能数据损坏或格式不支持。");
            return; // 或进行其他错误处理
        }

        // 3. 准备保存路径。使用 Path.Combine 来构建跨平台路径更安全
        string saveDirectory = "/home/user/Pictures/processed"; // 你的保存目录
        string filePath = Path.Combine(saveDirectory, $"card_photo_{DateTime.Now:yyyyMMddHHmmss}.jpg");

        // 确保目录存在
        Directory.CreateDirectory(saveDirectory);

        // 4. 创建文件流并保存图片
        // 使用 using 语句确保文件流被正确关闭和释放
        using (FileStream fileStream = File.OpenWrite(filePath))
        {
            // Encode 方法将 SKBitmap 编码为指定格式并写入流
            // 参数:流,编码格式,质量(1-100,仅对JPEG等有损格式有效)
            bool encodeSuccess = photoBitMap.Encode(fileStream, SKEncodedImageFormat.Jpeg, 90);

            if (encodeSuccess)
            {
                Console.WriteLine($"图片已成功保存至:{filePath}");
                Console.WriteLine($"图片尺寸:{photoBitMap.Width} x {photoBitMap.Height}");
            }
            else
            {
                Console.WriteLine("图片保存失败。");
            }
        } // 文件流在此自动关闭
    } // SKBitmap 在此自动释放
}

这段代码比原始文章的例子多了几层“保险”:资源管理(using语句)、错误处理(判空和编码结果检查)、路径安全(使用Path.Combine)和日志输出。在实际生产环境中,这些细节至关重要。

3.3 处理常见异常与性能考量

你可能会遇到哪些问题?我列几个常见的:

  1. 解码失败:SKBitmap.Decode 返回 null。原因可能是 photoByte 数据根本不是图片,或者图片格式SkiaSharp不支持(基本都支持),或者数据在传输过程中损坏。解决方法是检查数据源,确保前几步硬件或网络读取是正确的。
  2. 保存失败:Encode 返回 false 或抛出异常。可能原因:磁盘空间不足、没有目录写入权限、文件被占用。所以代码里我提前创建了目录,并使用了更安全的文件操作。
  3. 内存问题:处理超大图片(比如几千万像素的航拍图)时,直接解码可能会消耗大量内存。这时可以考虑使用 SKCodec 进行流式解码,或者先获取图片尺寸信息,决定是否需要先进行缩放采样后再解码,这个我们后面会讲。

性能上,SKBitmap.Decode 和 Encode 是主要开销。对于大量图片的批处理,可以考虑使用异步操作(async/await)配合并行处理(如 Parallel.ForEach)来提升吞吐量,但要小心线程安全和系统资源瓶颈。

4. 超越基础:SkiaSharp图片处理进阶技巧

只会保存图片可不够,SkiaSharp的真正威力在于它丰富的图像处理能力。让我们玩点更花的。

4.1 图片缩放、裁剪与旋转:动动手指的事

想象一下,用户上传了一张巨幅照片,你需要在麒麟系统的服务器上生成一张缩略图。用SkiaSharp怎么做?非常简单。

缩放:核心是 SKBitmap 的 Resize 方法,但更推荐使用 SKCanvas 进行高质量绘制缩放。

public static SKBitmap ResizeImage(SKBitmap original, int newWidth, int newHeight)
{
    // 创建一个新的、指定大小的位图
    var resizedBitmap = new SKBitmap(newWidth, newHeight);
    
    // 使用 Canvas 进行绘制,可以实现高质量的缩放(如抗锯齿)
    using (var canvas = new SKCanvas(resizedBitmap))
    {
        // 清除画布为透明(如果是PNG)或白色
        canvas.Clear(SKColors.Transparent);
        
        // 计算缩放比例,并保持居中绘制
        float scale = Math.Min((float)newWidth / original.Width, (float)newHeight / original.Height);
        float scaledWidth = original.Width * scale;
        float scaledHeight = original.Height * scale;
        float left = (newWidth - scaledWidth) / 2;
        float top = (newHeight - scaledHeight) / 2;
        
        var destRect = new SKRect(left, top, left + scaledWidth, top + scaledHeight);
        // 使用高质量采样进行绘制(缩放)
        canvas.DrawBitmap(original, destRect, new SKPaint { IsAntialias = true, FilterQuality = SKFilterQuality.High });
    }
    return resizedBitmap;
}

裁剪:使用 SKBitmap 的 Subset 方法,或者同样用 SKCanvas 绘制指定区域。

public static SKBitmap CropImage(SKBitmap original, SKRectI cropArea)
{
    // 创建一个裁剪区域大小的新位图
    var croppedBitmap = new SKBitmap(cropArea.Width, cropArea.Height);
    // 将原图指定区域复制到新位图
    if (original.ExtractSubset(croppedBitmap, cropArea))
    {
        return croppedBitmap;
    }
    return null;
}
// 使用:CropImage(photoBitMap, new SKRectI(100, 100, 500, 400)); // 裁剪 (100,100) 到 (500,400) 的区域

旋转:通过 SKCanvas 的 RotateDegrees 方法实现。

public static SKBitmap RotateImage(SKBitmap original, float degrees)
{
    // 计算旋转后画布的大小(防止边角被裁切)
    double radians = degrees * Math.PI / 180;
    double sin = Math.Abs(Math.Sin(radians));
    double cos = Math.Abs(Math.Cos(radians));
    int newWidth = (int)(original.Width * cos + original.Height * sin);
    int newHeight = (int)(original.Width * sin + original.Height * cos);

    var rotatedBitmap = new SKBitmap(newWidth, newHeight);
    using (var canvas = new SKCanvas(rotatedBitmap))
    {
        canvas.Clear(SKColors.Transparent);
        // 将画布原点平移到中心,然后旋转,再平移回来
        canvas.Translate(newWidth / 2, newHeight / 2);
        canvas.RotateDegrees(degrees);
        canvas.Translate(-original.Width / 2, -original.Height / 2);
        canvas.DrawBitmap(original, 0, 0);
    }
    return rotatedBitmap;
}

4.2 添加水印与文字:保护你的版权

给图片加上水印是常见需求。SkiaSharp绘制文字和图形非常方便。

public static void AddTextWatermark(SKBitmap bitmap, string watermarkText)
{
    using (var canvas = new SKCanvas(bitmap))
    {
        // 创建一个画笔(Paint)来定义文字样式
        var paint = new SKPaint
        {
            Color = SKColors.White.WithAlpha(0x80), // 半透明白色
            TextSize = 40, // 字号
            IsAntialias = true, // 抗锯齿
            Typeface = SKTypeface.FromFamilyName("Arial", SKFontStyleWeight.Bold, SKFontStyleWidth.Normal, SKFontStyleSlant.Upright) // 字体
        };
        
        // 测量文字宽度
        float textWidth = paint.MeasureText(watermarkText);
        
        // 计算水印位置(右下角)
        float x = bitmap.Width - textWidth - 20; // 右边距20像素
        float y = bitmap.Height - 20; // 下边距20像素
        
        // 可选:给文字加个阴影或背景框使其更清晰
        var shadowPaint = new SKPaint { Color = SKColors.Black.WithAlpha(0x80), TextSize = paint.TextSize, IsAntialias = true };
        canvas.DrawText(watermarkText, x + 2, y + 2, shadowPaint); // 绘制阴影
        
        // 绘制水印文字
        canvas.DrawText(watermarkText, x, y, paint);
    }
}

你还可以绘制图片Logo作为水印,使用 canvas.DrawBitmap 方法即可,原理类似。

4.3 格式转换与压缩:平衡质量与大小

SKBitmap.Encode 方法决定了输出格式。除了JPEG,还支持PNG、WEBP、BMP等。

// 保存为PNG(无损,支持透明)
using (var stream = File.OpenWrite("output.png"))
{
    bitmap.Encode(stream, SKEncodedImageFormat.Png, 100); // PNG的质量参数通常被忽略
}

// 保存为WebP(现代格式,压缩率高)
using (var stream = File.OpenWrite("output.webp"))
{
    bitmap.Encode(stream, SKEncodedImageFormat.Webp, 85); // 质量85
}

压缩技巧:对于JPEG,降低质量参数(第三个参数)可以显著减小文件大小,但会损失画质。通常75-90是一个比较好的平衡点。对于PNG,SkiaSharp编码时已经做了不错的压缩。如果你需要极致的PNG压缩,可以考虑在保存后使用像 optipng 这样的外部工具进行二次优化。

5. 调试技巧与麒麟系统专属问题排查

在麒麟系统上用VS Code调试C#项目,整体体验和Windows差不多,但有些地方需要注意。

5.1 在VS Code中高效调试SkiaSharp项目

首先,确保你的项目根目录下有 .vscode/launch.json 文件。通常创建项目或打开C#项目时,VS Code会提示你生成。这个文件配置了调试器。你需要确保 "console" 设置为 "integratedTerminal" 或 "externalTerminal",这样程序输出才能正常显示。

调试时,最常用的就是设断点。在 SKBitmap.Decode 或 Encode 前后设下断点,可以查看解码后的 bitmap 对象属性(Width, Height, BytesPerPixel等),确认数据是否正确。如果解码后 bitmap 为 null,立刻检查你的 byte[] 数据:长度是否正确?前几个字节是不是像图片文件头(比如JPEG是FF D8 FF)?你可以把 byte[] 的前20个字节以十六进制形式打印出来看看。

另一个有用的技巧是使用 SKImage.FromEncodedData 先尝试解码,它返回 SKImage,如果失败,异常信息可能比 SKBitmap.Decode 返回 null 更详细。

5.2 常见错误与解决方案一览表

我在麒麟系统上遇到的典型问题,都给你总结在这里了:

错误现象可能原因解决方案
DllNotFoundException: libSkiaSharp缺少SkiaSharp的本地依赖库。1. 安装 SkiaSharp.NativeAssets.Linux.NoDependencies 包,并确保版本与主包一致。
2. 检查项目文件 .csproj 中是否已正确引用该包。
System.TypeInitializationExceptionSkiaSharp初始化失败,通常是底层Skia库加载问题。1. 确保系统已安装基本的图形库,如 libfontconfig, libfreetype。在终端运行 sudo apt install libfontconfig1 libfreetype6(适用于基于Debian的麒麟)。
2. 确认系统架构(x64/arm64)与安装的NuGet包架构匹配。
解码成功但图片全黑或花屏字节数组数据格式与预期不符,或数据损坏。1. 验证数据源。如果是硬件读取,确认数据格式是标准的JPEG/PNG等,而不是包含自定义头尾的原始数据。
2. 尝试将 byte[] 先写入一个临时文件,用系统图片查看器打开,确认数据本身有效。
保存图片时权限被拒绝程序没有在目标目录的写入权限。1. 使用 Directory.CreateDirectory 创建目录,并检查当前运行用户的权限。
2. 考虑将图片保存到用户目录(如 Environment.GetFolderPath(Environment.SpecialFolder.MyPictures))或临时目录。
处理大量图片时内存飙升未及时释放 SKBitmap 等非托管资源。1. 务必使用 using 语句包裹 SKBitmap。
2. 对于批处理,考虑分批次进行,并在每批次结束后手动调用 GC.Collect()(谨慎使用)或使用 SKBitmap 的 Dispose 方法。

5.3 性能监控与优化建议

在服务器上处理图片,性能很重要。你可以用 System.Diagnostics.Stopwatch 来给关键代码段计时。

var stopwatch = Stopwatch.StartNew();
using (var bitmap = SKBitmap.Decode(imageData))
{
    // ... 处理图片
}
stopwatch.Stop();
Console.WriteLine($"解码并处理耗时:{stopwatch.ElapsedMilliseconds} ms");

如果发现单张图片处理耗时过长,检查图片尺寸是否过大。对于只是生成缩略图的场景,可以使用 SKCodec 进行部分解码或采样。

using (var codec = SKCodec.Create(new MemoryStream(imageData)))
{
    // 获取原始图片信息而不完全解码
    var info = codec.Info;
    Console.WriteLine($"原始尺寸:{info.Width}x{info.Height}");
    
    // 计算采样比例,例如目标宽度为200
    int sampleSize = info.Width / 200;
    if (sampleSize < 1) sampleSize = 1;
    
    // 创建采样选项
    var options = new SKCodecOptions { Subset = null, PremulBehavior = SKTransferFunctionBehavior.Respect };
    // 解码时进行采样,大幅减少内存和CPU消耗
    using (var sampledBitmap = SKBitmap.Decode(codec, info.WithSize(info.Width / sampleSize, info.Height / sampleSize), options))
    {
        // sampledBitmap 就是缩小后的位图
    }
}

最后,记得在麒麟系统上,将你的控制台项目发布为自包含(self-contained)的应用程序可能是一个好选择,尤其是需要分发给没有安装.NET运行时的环境时。使用 dotnet publish -c Release -r linux-x64 --self-contained true 命令,它会将.NET运行时和所有依赖(包括SkiaSharp的本地库)一起打包,避免目标环境缺少依赖的问题。

python 图像处理:图像的读取、显示与保存 skimage提供了io模块,顾名思义,这个模块是用来图片输入输出操作的。为了方便练习,也提供一个data模块,里面嵌套了一些示例图片,我们可以直接使用。 引入skimage模块可用: from skimage import io skimage包的全称是scikit-imageSciKit (toolkit forSciPy) ,它对scipy.ndimage进行了扩展,提供了更多... 阅读详情

相关推荐

银河麒麟系统中安装VSCode(Visual Studio Code)

银河麒麟系统中安装VSCode(Visual Studio Code)概述安装步骤运行结果下一步计划 概述 有个项目要用银河麒麟系统,安装了qt等相关编程工具。 还需安装vscode 安装步骤 官网下载vscode:访问Visual Studio Code官网 解压文件: tar -xcv code-stable-x64-1631295096.tar.gz 然后移动到 /usr/local/ 目录 mv VSCode-linux-x64 /usr/local/ 还需要给可执行的权限, 然后

liuning1898的专栏 1万+

小白在银河麒麟上安装vscode工具编译c/c++ 代码

麒麟安装vscode以及插件

xieaoa的博客 5375

麒麟系统使用-运用VSCode运行.NET工程

本文介绍了在麒麟系统中使用VSCode进行.NET开发的详细步骤。主要内容包括:1)通过命令行安装VSCode及必要扩展;2)配置环境变量设置dotnet路径;3)创建并配置launch.json和task.json文件;4)以控制台和网页工程为例,演示具体设置和运行过程。文章为开发者提供了在国产操作系统上使用VSCode进行.NET开发的环境搭建指南和调试方法,展现了该开发方案的可行性。

mystonelxj的博客 996

麒麟系统下的通用开发环境详细搭建步骤

麒麟下基本开发环境搭建

weixin_43626451的博客 8587

SimpleCollage:使用SkiaSharp进行简单的图片拼贴

大学 受Ashley启发的简单C#程序,使用SkiaSharp制作图像拼贴画:

Claude Code vs Codex

Claude Code 提供了一个生产就绪(production-ready)的实现,包含良好的错误处理、优雅的关闭逻辑、详细注释和文档,以及内置测试。Claude Code 输出了一个可运行的 Next.js + TypeScript 前端,但错过了一些设计里的黄色主题元素;Codex 则生成自己的版本,没有导出设计中的图片,也没严格遵照设计主题。Codex 完成同样功能,但更简洁直接,文档和注释少一些但功能达标。任务都用同样的提示,使用 TypeScript 实现,并在一天内完成。

weixin_49869937的博客 2388

在麒麟系统中利用VSCODE与C#实现高效图片处理方案

本文详细介绍了在麒麟系统上使用VS Code与C#语言,结合SkiaSharp库构建高效图片处理方案的完整流程。针对.NET Core在Linux上System.Drawing不可用的问题,提供了从环境搭建、核心库安装、代码实战到性能优化与常见错误排查的全方位指南,帮助开发者在国产化环境中实现图片解码、编辑、格式转换及硬件数据流处理。

oil88的博客 435

在 STM32CubeIDE 中针对 STM32F407 移植 ThreadX

在 STM32CubeIDE 中针对 STM32F407 移植 ThreadX,不依赖盗版破解的Keil MDK、IAR等软件。

wangyuewu08的博客 3374

麒麟系统下利用VSCODE与C#实现高效图片处理方案

本文详细介绍了在麒麟系统下使用VSCODE与C#实现高效图片处理的完整方案。从开发环境搭建、SkiaSharp库配置到核心代码实现,涵盖了图片缩放、水印添加等高级技巧,并提供了常见问题排查和性能优化建议,帮助开发者在国产操作系统上快速构建图片处理应用。

weixin_29285605的博客 182

Silvaco Atlas新手入门:从安装到第一个半导体器件仿真(附DeckBuild配置)

本文为Silvaco Atlas新手提供了一份从软件安装、DeckBuild环境配置到完成第一个半导体器件仿真的实战指南。通过构建一个经典的PN结二极管案例,详细讲解了Atlas仿真语句的语法、核心命令顺序以及结果调试与可视化方法,帮助初学者快速上手并理解TCAD仿真流程。

sql99的博客 332

VMware ESXi 7.0下Intel网卡SR-IOV配置实战:解决虚拟化网络延迟问题

本文详细介绍了在VMware ESXi 7.0环境下为Intel网卡配置SR-IOV(单根I/O虚拟化)的完整实战流程。通过硬件辅助直通技术,虚拟机可直接访问物理网卡资源,有效绕过虚拟化层瓶颈,从而显著降低网络延迟和CPU开销,适用于金融交易、实时计算等对性能敏感的场景。

embedding5hiker的博客 554

麒麟系统下用VSCode和C#处理图片:SkiaSharp避坑指南(附完整代码)

本文详细介绍了在麒麟系统下使用VSCode和C#结合SkiaSharp进行图片处理的完整指南。从开发环境配置、SkiaSharp集成到实战图像处理代码,提供了全面的避坑方案和优化建议,帮助开发者在国产操作系统上高效实现图片处理功能。

weixin_42567752的博客 221

c++通过自然语言处理技术分析语音信号音高

其中,缓冲区大小为2048,最小基频为80Hz,最大基频为1000Hz。通常情况下,音高在85Hz到255Hz之间,因此可以根据实际情况修改最小和最大基频值。C++中可以使用数字信号处理库或语音处理库,比如MATLAB、Praat、YIN算法等等来进行音高分析。对于语音信号的音高分析,可以使用基频提取技术。基频是指一个声音周期的重复率,也就是一个声音波形中最长的周期。通常情况下,人的声音基频范围是85Hz到255Hz。这段代码使用了YIN算法来计算语音信号的基频,得出的结果即为音高。

SYC20110120的博客 1728

麒麟系统使用VSCODE和C#进行图片处理

一、由于System.Common.Drawing在.netcore 6.0以上版本无法使用所以需要安装第三方库,这里使用的是SkiaSharp。此步骤可能不需要,由于调试过程中遇到问题后使用过该步骤所以给记录上,可以先不用此步骤运行以下步骤看看是否可以,如果不可以再运行此指令。3、使用以下指令安装制定版本的SkiaSharp.NativeAssets.Linux.NoDependencies(1、使用VSCODE打开项目,在终端输入以下指令安装SkiaSharp。

liudexin1985的专栏 1388

海康工业相机排雷笔记02-像素格式解析

工业相机使用过程记录 02-像素格式解析 通过将相机输出图像裸数据raw格式直接存图查看 一、黑白/Mono 直接使用相机测试图像存图: 图像中各部分灰度分别为:0、36、73、109、146、182、219、255,以灰度73列为例 (1)Mono 8 该列图像数据为十六进制49,十进制为73,那么Mono 8就是每个像素点占8bit,依次排列。 (2)Mono 10 该列图像数据为十六进制2401,由于相机均为小端数据,实际数据应解析为0124,十进制为292=73*4,那么Mono 10格式为每

yonghuming_66的博客 8359

YOLOv5改进系列(4)——添加ECA注意力机制

手把手教你在YOLOv5中加入ECA注意力机制,文内含两种方法,小白也能看懂!

路人贾的博客 8547

VSCODE+C#+SkiaSharp:麒麟系统图片处理从入门到实战

本文详细介绍了在麒麟国产操作系统上,使用VSCODE、C#和SkiaSharp图形库进行图片处理的完整实战流程。从.NET SDK环境搭建、SkiaSharp库引入,到图片加载、缩放、格式转换、添加水印等核心操作,提供了清晰的代码示例和性能优化建议,为开发者在非Windows平台施展C#图像处理能力提供了可靠路径。

omega的博客 119

大模型长对话中上下文无法承载全部历史,如何压缩或提取重点

如果说截断和滑动窗口是“硬性”压缩,那摘要生成技术就显得“软”多了,也更接近于智能化的解决方案。它的思路是:不直接丢弃历史,而是通过自然语言处理(NLP)技术,把冗长的对话记录浓缩成一段简短的摘要,保留核心信息。这样既能大幅减少token数量,又不至于丢失关键内容。这种方法通常会借助预训练模型,比如BART或T5,它们擅长从长文本中提取重点内容。

大模型大数据攻城狮的专栏 1588

银河麒麟(Kylin) - V10 SP2高级服务器操作系统ARM64编译VSCode失败日志

银河麒麟(Kylin) - V10 SP2高级服务器操作系统ARM64编译VSCode失败日志

alin、m 4252

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

SkiaSharp C# 绘图研究

最近研究C#跨平台,对Skia的C#封装也做了一些研究,对其中遇到的一些重难点问题进行了总结

揽月凡尘 1万+

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

Linux 系统基于 VSCode 搭建开发环境

银河麒麟系统上基于vscode搭建各种开发环境。

LiHuiChao 3547

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

银河麒麟系统安装vscode

点击系统左下角的菜单,在菜单中找到已安装完成的vscode运行即可(这跟windows一样)等待安装即可,弹出 对话框点击《是》即可。进入vscode下载页面。

无bug无江湖 3955

Net Core 获取图片像素大小(SkiaSharp)

Net Core 获取图片像素大小(SkiaSharp)

lenggeye的博客 743

c# .net linux ImageSharp+FastDFS+Base64上传图片,压缩图片大小,图像处理dcoker中使用也可以

如果项目运行到docker里,需要NUGET安装SkiaSharp.NativeAssets.Linux.NoDependencies。.net 以前是用System.Drawing来处理图片,但是在linux上用不了。新建controller,接收前端提交过来的base64,并返回上传后的文件名。nuget安装SixLabors.ImageSharp。新建类:FastDFSNetCoreHelper.cs。2、ImageSharp 用起来这个方便一些,推荐。这里用ImageSharp 为例子。

qq_16005627的博客 1734

如何在银河麒麟操作系统上搭建 Electron (含 Electron 打包指南)

随着跨平台应用开发的需求日益增长,Electron 和 Qt 成为了两种广受欢迎的选择。Electron 以其简单易用、快速开发的特点吸引了众多前端开发者,而 Qt 则因其强大的图形界面支持和高效的性能表现受到了许多专业软件开发者的青睐。银河麒麟操作系统作为一款基于 Linux 的国产操作系统,其安全稳定的特点使得它成为了政府机构和企业用户的优选。

LKHzzzzz的博客 6080
上一篇: lncRNA功能预测新思路:从序列到相互作用的深度学习解决方案
下一篇: Room数据库高级玩法:用@Ignore注解实现业务逻辑与数据层分离
五行擒拿术
博客等级 码龄26年 54粉丝 1361原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值