我正在使用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;
}
任何人都知道如何在内存中减少图像大小(因为我有一些可以预览和旋转的扫描)?感谢。
答案 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);
}
}
}