C# 实现reisze图像数据 使用双线性插值方法

本文介绍了一个使用C#编写的程序,通过双线性插值算法调整图像尺寸,将一个1080x810x3的图像调整为640x640x3,展示了ResizeImage方法的实现过程和像素值计算
摘要由CSDN通过智能技术生成
using System;

class Program
{
    static void Main(string[] args)
    {
        // 假设有一个 1080x810x3 的图像
        int originalWidth = 1080;
        int originalHeight = 810;
        int originalChannels = 3;

        // 假设要调整为 640x640x3 的大小
        int newWidth = 640;
        int newHeight = 640;
        int newChannels = 3;

        // 假设原始图像数据存储在一个一维数组中
        byte[] originalImageData = new byte[originalWidth * originalHeight * originalChannels];

        // 假设已经填充了原始图像数据

        // 进行大小调整
        byte[] resizedImageData = ResizeImage(originalImageData, originalWidth, originalHeight, originalChannels, newWidth, newHeight, newChannels);

        // 输出调整后的图像大小
        Console.WriteLine("调整后的图像大小: " + resizedImageData.Length);

        // 等待用户按下任意键结束程序
        Console.WriteLine("按任意键退出...");
        Console.ReadKey();
    }

    // 调整图像大小的方法(双线性插值)
    static byte[] ResizeImage(byte[] originalImageData, int originalWidth, int originalHeight, int originalChannels, int newWidth, int newHeight, int newChannels)
    {
        byte[] resizedImageData = new byte[newWidth * newHeight * newChannels];

        double xRatio = (double)originalWidth / newWidth;
        double yRatio = (double)originalHeight / newHeight;

        for (int y = 0; y < newHeight; y++)
        {
            for (int x = 0; x < newWidth; x++)
            {
                for (int c = 0; c < newChannels; c++)
                {
                    double sourceX = x * xRatio;
                    double sourceY = y * yRatio;

                    int x1 = (int)Math.Floor(sourceX);
                    int x2 = Math.Min(x1 + 1, originalWidth - 1);
                    int y1 = (int)Math.Floor(sourceY);
                    int y2 = Math.Min(y1 + 1, originalHeight - 1);

                    double dx = sourceX - x1;
                    double dy = sourceY - y1;

                    double interpolatedValue = (1 - dx) * (1 - dy) * GetPixelValue(originalImageData, originalWidth, originalHeight, originalChannels, x1, y1, c)
                        + dx * (1 - dy) * GetPixelValue(originalImageData, originalWidth, originalHeight, originalChannels, x2, y1, c)
                        + (1 - dx) * dy * GetPixelValue(originalImageData, originalWidth, originalHeight, originalChannels, x1, y2, c)
                        + dx * dy * GetPixelValue(originalImageData, originalWidth, originalHeight, originalChannels, x2, y2, c);

                    resizedImageData[(y * newWidth + x) * newChannels + c] = (byte)interpolatedValue;
                }
            }
        }

        return resizedImageData;
    }

    // 获取指定位置像素的值
    static double GetPixelValue(byte[] imageData, int width, int height, int channels, int x, int y, int channel)
    {
        int index = (y * width + x) * channels + channel;
        return imageData[index];
    }
}

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值