【问题标题】:ImageResizer - specify portrait or landscapeImageResizer - 指定纵向或横向
【发布时间】:2020-07-21 22:59:01
【问题描述】:

我们想要拍摄一张扫描的图像并确定它是横向还是纵向,然后根据用户将其旋转为横向或纵向的偏好,在需要时进行旋转。

即用户希望它是纵向的,但它的原始格式是横向的。

我们如何确定它是纵向还是横向,然后如果需要,将其旋转 90 度。

尝试这样的事情,但卡在未打开或重置的流上等等......但更重要的是,这是正确/最有效的方法吗?我没有看到任何自动执行此操作的说明,例如:desiredAspectRation=Portrait;,它已经在 ImageResizer.net 中执行此操作,对吗?

int? imageWidth;
int? imageHeight;

using (var updatedImageFileStream = new MemoryStream())
{
    ImageJob imageJob = new ImageJob(origFileStream, updatedImageFileStream,
        new Instructions(strInstructions)
    );
    imageJob.Build();

    //change to portrait if required
    imageWidth = imageJob.SourceWidth;
    imageHeight = imageJob.SourceHeight;

    if(imageWidth > imageHeight)
    {
        //updatedImageFileStream.Seek(0, SeekOrigin.Begin);

        strInstructions = "rotate=90;";
        imageJob = new ImageJob(updatedImageFileStream, updatedImageFileStream,
            new Instructions(strInstructions)
        );
        imageJob.Build();
    }

    updatedImageFileStream.Seek(0, SeekOrigin.Begin);

    //upload image to azure
    await azureRepository.UploadAsync(serverRelativePath, updatedImageFileStream, contentType);
    origFileStream.Dispose();
}

更新

使用下面的方法让它工作。但不确定它是否最有效。

  • 您是否需要创建一个新流,或者ImageJob 可以采用相同的源和目标来覆盖它...我在尝试时收到一个错误,提示无法访问已关闭的流,所以也许您确实需要创建一个新的像我一样流式传输。

  • 我不喜欢重复调用来上传图像(await azureRepository.UploadAsync(serverRelativePath, updatedImageFileStream, contentType);),但我不知道如何将第二个图像流复制到第一个图像流上,所以我可以只保留一个对UploadAsync 的调用。我不断收到无法访问关闭的流类型错误。

  • 我还有什么遗漏吗?

工作代码,但高效?

int? imageWidth;
int? imageHeight;

using (var updatedImageFileStream = new MemoryStream())
{
    ImageJob imageJob = new ImageJob(origFileStream, updatedImageFileStream,
        new Instructions(strInstructions)
    );
    imageJob.Build();

    //change to portrait if required - WORKS, uncomment if want to do 100% of time, or this is how to implement based on a parameter of "change to Portrait"
    imageWidth = imageJob.SourceWidth;
    imageHeight = imageJob.SourceHeight;

    if (imageWidth > imageHeight)
    {
        updatedImageFileStream.Seek(0, SeekOrigin.Begin);

        strInstructions = "rotate=90;";
        var updatedImageFileStream2 = new MemoryStream();
        imageJob = new ImageJob(updatedImageFileStream, updatedImageFileStream2,
            new Instructions(strInstructions)
        );
        imageJob.Build();

        updatedImageFileStream2.Seek(0, SeekOrigin.Begin);

        //upload image to azure
        await azureRepository.UploadAsync(serverRelativePath, updatedImageFileStream2, contentType);
        updatedImageFileStream2.Dispose();
    }
    else
    {
        updatedImageFileStream.Seek(0, SeekOrigin.Begin);

        //upload image to azure
        await azureRepository.UploadAsync(serverRelativePath, updatedImageFileStream, contentType);
    }

    origFileStream.Dispose();
}

【问题讨论】:

    标签: c# asp.net-mvc imageresizer


    【解决方案1】:

    您可以使用Config.Current.CurrentImageBuilder.LoadImage 代替处理图像以获取尺寸,并在生成的Bitmap 实例上查询.Width 和.Height。记得扔掉它。

    对于更快的解决方案,您可以使用Imageflow.NET,使用ImageJob.GetImageInfo() 方法来获取宽度/高度,并使用ImageJob.BuildCommandString(source, dest, "rotate=90") 来执行旋转。这也有利于以更高的质量水平生成更小的文件。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-07-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-04-11
      • 1970-01-01
      相关资源
      最近更新 更多