如何裁剪作为字节数组的图像

时间:2018-04-12 18:17:42

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

我有一个Azure功能,想要裁剪一个字节数组内的图像,然后将其保存到blob中。我不知道如何进行裁剪部分,因为Azure函数中没有位图。这是我对blob的保存:

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

它可以正常工作。另外,如果有帮助的话,我有要裁剪的图像的网址。只是不知道如何使用Azure功能实现此目的。有什么想法吗?

修改

original image

这是原始图像,我在一个字节数组中。我想用它来裁剪另一个大小 - 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的大小 - 字节[49121]

如果我设置了这是输出:

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

cropped image

1 个答案:

答案 0 :(得分:0)

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像素(不匹配)时,我应该看到这个道歉。