【问题标题】:How to crop image that is a byte array如何裁剪作为字节数组的图像
【发布时间】:2018-04-12 18:17:41
【问题描述】:

我有一个 Azure 函数,想要裁剪字节数组中的图像,然后将其保存到 blob。我不确定如何进行裁剪部分,因为 Azure Functions 中不提供位图。这是我保存到 blob 的内容:

private async static Task<string> CreateBlob(string name, byte[] data, TraceWriter log)

它可以很好地完成它的工作。另外,如果有帮助,我还有要裁剪的图像的 URL。只是不知道如何使用 Azure 函数来实现这一点。有什么想法吗?

编辑

这是原始图像,我在一个字节数组中。我想从中裁剪另一个尺寸 - 650x290

int cropStartX = 0;
int cropStartY = 0;
int cropWidth = 650;
int cropHeight = 290;
int multiply = cropWidth * cropHeight;

byte[] croppedImage = new byte[multiply];

for (int j = cropStartX; j < cropStartX + cropWidth; j++)
{
    for (int k = cropStartY; k < cropStartY + cropHeight; k++)
    {
        if ((j + k * cropWidth) >= ((byte[])OriginalPic).Length)
            break;

        croppedImage[j + k * cropWidth] = ((byte[])OriginalPic)[j + k * cropWidth];
        }
    }

这是 OriginalPic 的大小 - byte[49121]

这是我设置后的输出:

croppedImage[j + k * cropWidth] = ((byte[])OriginalPic)[j + k * (cropWidth + 20)];

【问题讨论】:

  • 如果图像在一个字节数组中......有什么理由你不能只索引并复制你需要的东西?
  • 这可能吗?我需要从中裁剪出一些小图片,并且我知道它们的具体坐标和大小。如果我可以将它们分别放在几个字节数组中,那就太好了,这将是完美的情况,但我不知道如何操作字节数组来获取小图片。有什么想法吗?
  • 一维字节数组?
  • 您很可能需要一个图像处理库。图像有多种格式(每像素位数、字节顺序、托盘/直接等)和编码(压缩/原始)。任何图像处理库都应该能够将图像导出到原始字节数组。
  • 您的图像数据已压缩,无法在字节索引查找中裁剪。

标签: c# .net azure image-processing azure-functions


【解决方案1】:

idk 如果这是您所追求的,但假设您知道图片的尺寸,您只需将其编码到您的索引中:

伪代码

int cropWidth = 100;
int cropHeight = 50;
byte[cropWidth*cropHeight] croppedImage;
for(int i=cropStartX;i<cropStartX+cropWidth;i++)
{
    for(int ii = cropStartY;ii<cropStartY+cropHeight;ii++)
    {
        croppedImage[i + ii*cropWidth] = image[i + ii*mainImageWidth];
    }
}

我知道这并不像您实际上可以只执行内存复制功能那样快......但会做您需要的。


更新:在查看了您的更多信息后,我担心这种方法对您不起作用,因为您已经压缩了图像数据。基本上 jpeg 以大约 1:10 的大小压缩数据,这更有意义,因为您的图像字节数组只有 49k,因为这几乎是文件大小,其中包含 rgb 的 1024x434 图片的 jpeg 压缩信息。长话短说,您不能简单地从该数组中查询像素位置以获取有意义的数据,除非您在裁剪之前解压缩图像。抱歉,我一注意到“字节”应该代表一个 rgb 像素(不匹配),就应该看到这一点。

【讨论】:

  • 请注意,根据图像和语言的具体情况,您可能需要在其中几行中进行一些转换(即 + 或 - 1)。
  • 这看起来正是我正在寻找的,但它崩溃了一个异常“索引超出了数组的范围”
  • 是的,这就是我所说的索引移位。如果您发布更多包含图像尺寸和内容的代码,我可能会帮助您调试。但是,只需运行断点并检查您的索引即可。
  • 另一种调试此类事情的好方法是制作标记,即不要裁剪出你想要的图像,只需复制原始图像并用这些目标像素着色,这样你就可以看到它们是否是否在您期望的地方发生变化。
  • 我使用您提供的代码,但我通常希望裁剪图像的宽度与原始图像的宽度相同,所以我猜“mainImageWidth”应该与“cropWidth”相同?跨度>
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2022-10-23
  • 2019-01-05
  • 2011-10-12
  • 1970-01-01
  • 2014-04-29
  • 2018-12-13
  • 1970-01-01
相关资源
最近更新 更多