【问题标题】:How can I clone FileStream type?如何克隆 FileStream 类型?
【发布时间】:2011-01-19 10:26:00
【问题描述】:

如何克隆 FileStream 类型?

问题是我在保存之前使用MagickNet.Image(inputStream) 获取图像扩展,但它似乎关闭了输入流。

那么,我可以向函数发送一个 inputStream 的克隆,这样函数就不能编辑真正的 inputStream 对象了吗?

这是我的功能:

public Picture GetPictureDimension(Stream inputStream, Picture picture)
{
    var img = new MagickNet.Image(inputStream);

    picture.Width = img.Columns;
    picture.Height = img.Rows;

    return picture;
}

【问题讨论】:

    标签: c# .net xna clone


    【解决方案1】:

    您可以重新打开文件吗?但是要保留一个Stream 而不关闭它,您可以尝试MiscUtil 中的NonClosingStreamWrapper。请务必在适当的情况下重置Position

    【讨论】:

    • 我不确定 MagickNet.Image 是否会关闭流,因为它缺少文档,但我确信在此函数之后,readStream.Read 返回零字节。所以,我认为如何调试它的第一件事是创建流类型的克隆,但是在查看了如何做到这一点之后,这似乎不是一件容易的事。所以这提出了一个问题,我们如何克隆这样的类型?
    • 如果流位置在末尾,Read 将执行此操作。它很可能只是读到流的末尾。
    • 如果是封闭流,Read 会抛出。
    • @Mendy - 在这种情况下,您确定它不只是在流的末尾吗?在调用Read(...)之前尝试设置theStream.Position = 0;
    • @Josh:你是对的。 @Marc:谢谢。但是你能回答这个问题吗,我们可以在 c# 中克隆这种类型的对象吗?
    【解决方案2】:

    您没有发布完整的代码,但我想MagickNet.Image(inputStream) 获取了完整的图像,而您只使用了其中的 Size,然后您再次加载了该图像。

    因此,更实用的解决方案是只在内存中获取并保存图像一次。这使您可以访问大小。

    编辑:

    您似乎没有意识到这一点,但您正在询问如何两次加载图像(不重新打开流)。我确实认为只加载一次会更有效。

    Picture 是一个 XNA 类,对吧?我对此了解不多,但您可以尝试以下方法:

    public Picture GetPictureDimension(Stream inputStream, ref Picture picture)
    {
        var img = new MagickNet.Image(inputStream);
    
        picture = new Picture(img);  // just guessing here
        //picture.Width = img.Columns;
        //picture.Height = img.Rows;
    
        return picture;
    }
    

    【讨论】:

    • 我只持有一次,但不幸的是Image(inputStream)损坏了它,所以我问如何克隆它,所以我不需要加载它两次。
    • 不,您正在加载它(到img),然后在仅使用大小后将其丢弃。浪费。
    • @Mendy:是的,你正在丢弃它。 img 是一个本地变量,你会丢失它。只需按住图像,无需克隆 Stream。
    • @Henk:失去img 并不意味着失去inputStreaminputStream 仍然被引用。
    • @mendy:但是 InputStream 变得“用完了”。正如 Streams 所做的那样。而且读两遍总是浪费。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-06-16
    • 1970-01-01
    • 2018-03-26
    • 2014-01-09
    • 1970-01-01
    相关资源
    最近更新 更多