简体   繁体   English

从/向流而不是磁盘保存/加载图像

[英]Saving/Loading Images from/to stream instead of a disk

I have the following code which takes an improperly saved Image from the database converts it to a Jpeg and returns the Image in a byte array; 我有以下代码,该代码从数据库中获取了保存不正确的图像,并将其转换为Jpeg并以字节数组形式返回了图像;

    public Byte[] GetImageFromDB(int id)
    {
        var imageData = _repository.GetImage(id);
        var newImageData = ConvertCorruptedImage(imageData, id);
        return newImageData;
    }

    private byte[] ConvertCorruptedImage(byte[] imageData, int id)
    {
        // Save DB Image as a file. 
        MemoryStream img = new MemoryStream(imageData);
        var saveDBImage = Image.FromStream(img);


        string originalFileName = @"c:\original_" + id.ToString() + ".jpg";
        string newFileName = @"C:\new" + id.ToString() + ".jpg";

        // Delete if already Exists
        DeleteImageFile(originalFileName);

        saveDBImage.Save(originalFileName);


        // Read Saved DB Image From Saved File & Save as jpeg
        Bitmap bm = new Bitmap(originalFileName);
        bm.Save(newFileName , ImageFormat.Jpeg);

        // Return Converted JPEG Image
        var newImage = ImageToByte(Image.FromFile(newFileName));

        //DeleteCreatedImage(newFileName);
        //DeleteCreatedImage(originalFileName);

        return newImage;
    }


    private byte[] ImageToByte(Image img)
    {
        ImageConverter converter = new ImageConverter();
        return (byte[])converter.ConvertTo(img, typeof(byte[]));
    }

    public static void DeleteImageFile(string fileName)
    {
        FileInfo file = new FileInfo(fileName);
        if (file.Exists && !file.IsReadOnly)
        {
            System.IO.File.Delete(fileName);
        }
    }

I was wondering if there was a way to do this without saving a file to the hard disk or if i do save it then deleting it once i am done with it. 我想知道是否有一种方法可以在不将文件保存到硬盘的情况下进行保存,或者如果我确实保存了文件,则在完成后将其删除。

I've tried adding a delete for each images (check the commented out portion of the ConvertCorruptedImage method) but i keep getting the following error: 我尝试为每个图像添加删除(请检查ConvertCorruptedImage方法的注释掉的部分),但我一直收到以下错误:

The process cannot access the file 'C:\new_xx.jpg' because it is being used by another process.

I really don't want to be saving images to a hard disk. 我真的不想将图像保存到硬盘上。

Thanks in advance 提前致谢

something along the lines of 类似于

var image = Image.FromStream(new MemoryStream(imageData));
            Bitmap bmp = new Bitmap(image);
            MemoryStream outStream = new MemoryStream();
            bmp.Save(outStream,ImageFormat.Jpeg);
            return outStream.ToArray();

Use the overload of Bitmap.Save that writes to a Stream. 使用写入到Stream的Bitmap.Save的重载。

var stream = new MemoryStream();
bm.Save(stream, ImageFormat.Jpeg);

You can load the bitmap directly from your MemoryStream : 您可以直接从MemoryStream加载位图:

Bitmap bm = new Bitmap(imgStream);

You can also save the bitmap to a stream: 您还可以将位图保存到流中:

MemoryStream newImgStream = new MemoryStream();
bm.Save(newMemoryStream, ImageFormat.Jpeg);

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM