2012-01-19 17 views
2

私はWIA 2.0を使用してHPスキャナから画像をスキャンしています。問題は、保存されたTIFFが約9MBもの大きさであることです(A4ページ、300dpi、グレースケール)。私はあなたがプレビューすることができますスキャンのlsitを持っているので、WPFアプリケーションでのWIAスキャン

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; 
    } 

誰もが(メモリ内可能であれば、画像サイズを小さくする方法のアイデアを持っている:私はこのようなたBitmapSourceにTIFF形式でスキャン含まWIAの画像ファイルを変換します回転する)?ありがとう。

+0

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); } } } 
BTW使用ブロック内のストリームを閉じる必要はない、なぜなら画像

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

と.Imageの実装を書き込みます処理中にストリームは自動的に閉じられます。 – Clemens

答えて

3

圧縮を使用します。この例のCcitt4は、白黒のFAX圧縮用ですが、圧縮係数は大きいですが、グレースケールを維持したい場合は他のバージョンがあります。

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; 
} 

そしてある...

関連する問題