WIA扫描WPF应用程序

时间:2012-01-19 12:08:26

标签: c# wpf scanning wia

我正在使用WIA 2.0扫描HP扫描仪中的图像。问题是保存的TIFF大约9MB(A4页面为300dpi,灰度)。我将包含TIFF格式扫描的WIA的ImageFile转换为BitmapSource,如下所示:

    public static BitmapSource ConvertScannedImage(ImageFile imageFile)
    {
        if (imageFile == null)
            return null;

        // save the image out to a temp file
        string fileName = Path.GetTempFileName();

        // this is pretty hokey, but since SaveFile won't overwrite, we
        // need to do something to both guarantee a unique name and
        // also allow SaveFile to write the file
        File.Delete(fileName);

        // now save using the same filename
        imageFile.SaveFile(fileName);

        BitmapFrame img;

        // load the file back in to a WPF type, this is just
        // to get around size issues with large scans
        using (FileStream stream = File.OpenRead(fileName))
        {
            img = BitmapFrame.Create(stream, BitmapCreateOptions.None, BitmapCacheOption.OnLoad);

            stream.Close();
        }

        // clean up
        File.Delete(fileName);

        return img;
    }

任何人都知道如何在内存中减少图像大小(因为我有一些可以预览和旋转的扫描)?感谢。

1 个答案:

答案 0 :(得分:3)

使用压缩。这个例子Ccitt4用于黑白传真压缩,压缩因子很大,但如果你想保持灰度,还有其他版本。

using System.Windows.Media.Imaging;


public static byte[] ConvertBitmapSourceToByteArray(BitmapSource imageToConvert, ImageFormat formatOfImage)
{
    byte[] buffer;
    try
    {
        using (var ms = new MemoryStream())
        {
            switch (formatOfImage)
            {
                case ImageFormat.Png:
                    var bencoder = new PngBitmapEncoder();
                    bencoder.Frames.Add(BitmapFrame.Create(imageToConvert));
                    bencoder.Save(ms);
                    break;

                case ImageFormat.Tiff:
                    var tencoder = new TiffBitmapEncoder();
                    tencoder.Compression = TiffCompressOption.Ccitt4;
                    tencoder.Frames.Add(BitmapFrame.Create(imageToConvert));
                    tencoder.Save(ms);
                    break;
            }
            ms.Flush();
            buffer = ms.GetBuffer();
        }
    }
    catch (Exception) { throw; }

    return buffer;
}

然后写图像

doc.SaveDirectory = DestinationDirectoryImages;
doc.Filename = fName;
doc.Image = ImageConversion.ConvertBitmapSourceToByteArray(img.Image, ImageFormat.Tiff);

和.Image的实现是......

private byte[] _image;
/// <summary>
/// Bytes for Image. Set to null to delete related file.
/// </summary>
public virtual byte[] Image
{
    get
    {
        if (_image == null)
        {
            if (SaveDirectory == null) throw new ValidationException("SaveDirectory not set for DriverDoc");
            string fullFilename = Path.Combine(SaveDirectory, Filename);
            if (!string.IsNullOrEmpty(fullFilename))
                if (File.Exists(fullFilename))
                    _image = File.ReadAllBytes(fullFilename);
                else
                    _image = File.ReadAllBytes("Resources\\FileNotFound.bmp");
        }
        return _image;
    }
    set
    {
        if (_image == value) return;
        _image = value;
        if (SaveDirectory == null) throw new ValidationException("SaveDirectory not set for DriverDoc");
        string fullFilename = Path.Combine(SaveDirectory, Filename);
        if (_image != null)
        {
            if (!string.IsNullOrEmpty(fullFilename))
            {
                _image = value;
                File.WriteAllBytes(fullFilename, _image);
            }
        }
        else
        {
            if (!string.IsNullOrEmpty(Filename) && File.Exists(fullFilename))
                File.Delete(fullFilename);
        }
    }
}