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];
}
}