我有一个应用程序,允许用户定义图像的区域并将该区域保存到文件.我遇到了一个我无法解决的障碍.我创建的用于绘制所选区域的位图卡在"MemoryBmp"的ImageFormat中,看起来这是为任何非文件加载的位图设置的ImageFormat.问题是我的Bitmap是在内存中创建的,我想将它保存为CCITT4双色调TIFF但是我得到了"GDI +中发生了一般错误"的异常.我非常有信心这是因为Image.RawFormat属性是可怕的MemoryBmp.
Image.Save()有一个带有ImageFormat参数的重载,当我使用它传递ImageFormat.Tiff它保存得很好,但我没有机会指定我的编码器参数.
我能想到的唯一可能的解决方法是使用Image.Save(Image,ImageFormat)保存到磁盘然后重新加载它(RawFormat现在将正确设置为ImageFormat.Tif)然后再次保存通过编码器设置.这只是愚蠢,必须有更好的方法.
这里有一段代码(这只是测试内容),如果我之前的描述不够清楚,应该让你知道我在做什么:
SizeF dpiScale = GetScreenToImageDPIRatio(loadedImage);
using (Bitmap image = new Bitmap(loadedImage,
(int)(_cropBox.Width * dpiScale.Width),
(int)(_cropBox.Height * dpiScale.Height)))
{
image.SetResolution(loadedImage.HorizontalResolution,
loadedImage.VerticalResolution);
using (Graphics g = Graphics.FromImage(image))
{
g.DrawImage(loadedImage, 0, 0, new Rectangle(
(int)(_cropBox.Location.X * dpiScale.Width),
(int)(_cropBox.Location.Y * dpiScale.Height),
(int)(_cropBox.Width * dpiScale.Width),
(int)(_cropBox.Height * dpiScale.Height)),
GraphicsUnit.Pixel);
}
// It's stuck as a MemoryBmp so none of these checks will work
if (true || image.RawFormat.Equals(ImageFormat.Tiff))
{
ImageCodecInfo tiffCodecInfo = ImageUtils.GetEncoderInfo("image/tiff");
EncoderParameters myEncoderParameters = new EncoderParameters(2);
myEncoderParameters.Param[0] = new
EncoderParameter(System.Drawing.Imaging.Encoder.Compression, …
Run Code Online (Sandbox Code Playgroud) 我已经能够使用以下C#代码创建Format48bppRgb .PNG文件(来自某些内部HDR数据):
Bitmap bmp16 = new Bitmap(_viewer.Width, _viewer.Height, System.Drawing.Imaging.PixelFormat.Format48bppRgb);
System.Drawing.Imaging.BitmapData data16 = bmp16.LockBits(_viewer.ClientRectangle, System.Drawing.Imaging.ImageLockMode.WriteOnly, bmp16.PixelFormat);
unsafe { (populates bmp16) }
bmp16.Save( "C:/temp/48bpp.png", System.Drawing.Imaging.ImageFormat.Png );
Run Code Online (Sandbox Code Playgroud)
ImageMagik(和其他应用程序)验证这确实是一个16bpp的图像:
C:\temp>identify 48bpp.png
48bpp.png PNG 1022x1125 1022x1125+0+0 DirectClass 16-bit 900.963kb
Run Code Online (Sandbox Code Playgroud)
然而,我很失望地发现,在重新读取PNG时,它已被转换为Format32bppRgb,当使用时:
Bitmap bmp = new Bitmap( "c:/temp/48bpp.png", false );
String info = String.Format("PixelFormat: {0}", bmp.PixelFormat );
...
Run Code Online (Sandbox Code Playgroud)
鉴于PNG编解码器可以编写Format48bppRgb,有没有什么方法可以使用.NET在没有转换的情况下读取它?我不介意它是否为DrawImage调用执行此操作,但我想访问解压缩的原始数据以进行某些直方图/图像处理工作.
我收到这个错误.这是代码:
Image image;
BitmapImage BmpImg;
MemoryStream ms;
public void Convert()
{
ms = new MemoryStream();
image.Save(ms, ImageFormat.Jpeg);
BmpImg = new BitmapImage();
BmpImg.BeginInit();
BmpImg.StreamSource = new MemoryStream(ms.ToArray());
BmpImg.EndInit();
}
private void Btn_Click(object sender, RoutedEventArgs e)
{
Dispatcher.Invoke(new Action(() => { Image.Source = BmpImg; }));
}
Run Code Online (Sandbox Code Playgroud)
如何将System.Drawing.Image转换为BitmapImage并在wpf上显示相同的内容?
任何人都有一个很好的例子,说明如何将文本写入jpg图像并使用.NET中的System.Drawing重新保存它?
我保存bmp格式的代码:
ImgResult.Save(dlgSavePicture.FileName, System.Drawing.Imaging.ImageFormat.Bmp)
我已经尝试了代码,输出是一个512x512 bmp图像,大小为1兆字节
如果我使用ms paint创建一个515x512 bmp图像,大小为768kb
我试图打开图像并重新保存为bmp,大小仍为1MB
512x512的512x512 bmp图像大小可达1mb吗?或者我的代码有问题?