You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在C#中不依赖平台类型创建ByteImage并传入pHash库

用ImageSharp跨平台创建pHash所需的ByteImage

完全可以通过ImageSharp这类跨平台库手动创建IByteImage实例,摆脱对Bitmap等平台依赖类型的限制。核心思路是用ImageSharp完成图片加载、灰度转换,提取像素数据后直接构造符合pHash要求的ByteImage(或自定义实现IByteImage)。

具体实现步骤及代码示例

  1. 引入必要的NuGet包:SixLabors.ImageSharp、SixLabors.ImageSharp.Processing和pHash
  2. 用ImageSharp加载图片并转灰度:
using SixLabors.ImageSharp;
using SixLabors.ImageSharp.PixelFormats;
using SixLabors.ImageSharp.Processing;
using PHash;

// 加载图片
using var image = Image.Load<Rgba32>(fullPathToImage);

// 转换为灰度图(对应pHash的ToLuminanceImage逻辑)
image.Mutate(ctx => ctx.Grayscale());
  1. 提取灰度像素的字节数据:
var width = image.Width;
var height = image.Height;
var luminanceBytes = new byte[width * height];
int idx = 0;

// 按行遍历提取灰度值(灰度图的R/G/B通道值一致,取任意一个即可)
for (int y = 0; y < height; y++)
{
    var row = image.GetPixelRowSpan(y);
    foreach (var pixel in row)
    {
        luminanceBytes[idx++] = pixel.R;
    }
}
  1. 构造ByteImage实例并计算哈希:
// 直接使用pHash的ByteImage构造函数(需确认构造参数顺序,不同版本可能略有差异)
var byteImage = new ByteImage(width, height, luminanceBytes);

// 计算图片哈希
var hash = ImagePhash.ComputeDigest(byteImage);

特殊情况处理:如果ByteImage构造函数未公开

若pHash未公开ByteImage的构造函数,可自行实现IByteImage接口:

public class CustomLuminanceImage : IByteImage
{
    public int Width { get; }
    public int Height { get; }
    private readonly byte[] _data;

    public CustomLuminanceImage(int width, int height, byte[] data)
    {
        Width = width;
        Height = height;
        _data = data;
    }

    // 实现IByteImage的索引器,返回指定坐标的灰度值
    public byte this[int x, int y] => _data[y * Width + x];
}

之后用new CustomLuminanceImage(width, height, luminanceBytes)替代ByteImage即可。

注意事项

  • 确保像素数据的存储顺序为行优先(从上到下,每行从左到右),与pHash预期的格式一致,避免哈希计算错误
  • 灰度转换需和ToLuminanceImage的逻辑对齐,ImageSharp的Grayscale默认使用ITU-R BT.709标准,若pHash有特殊灰度算法,需调整转换逻辑

内容的提问来源于stack exchange,提问作者BorisR

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.26 22:08:16