1

WIA 2.0 を使用して、HP スキャナーから画像をスキャンしています。問題は、保存された TIFF のサイズが約 9MB (300dpi の A4 ページ、グレースケール) になることです。次のように、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;
    }

可能であればメモリ内で画像サイズを縮小する方法を知っている人はいますか (プレビューして回転できるスキャンのリストがあるため)。ありがとう。

4

1 に答える 1

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);
        }
    }
}
于 2012-01-20T14:26:52.130 に答える