标签: system.drawing.imaging

使用EncoderParams将MemoryBmp上的Image.Save()转换为TIFF - 如何?

我有一个应用程序,允许用户定义图像的区域并将该区域保存到文件.我遇到了一个我无法解决的障碍.我创建的用于绘制所选区域的位图卡在"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# system.drawing gdi+ system.drawing.imaging

2
推荐指数
1
解决办法
6273
查看次数

在.NET中读取/保留PixelFormat.Format48bppRgb PNG位图?

我已经能够使用以下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调用执行此操作,但我想访问解压缩的原始数据以进行某些直方图/图像处理工作.

.net c# png gdi+ system.drawing.imaging

2
推荐指数
1
解决办法
5507
查看次数

错误:调用线程无法访问此对象,因为另一个线程拥有它

我收到这个错误.这是代码:

    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上显示相同的内容?

c# wpf bitmapimage system.drawing.imaging

2
推荐指数
1
解决办法
819
查看次数

如何在jpg上绘制文本并使用system.drawing在c#中重新保存它

任何人都有一个很好的例子,说明如何将文本写入jpg图像并使用.NET中的System.Drawing重新保存它?

c# asp.net system.drawing system.drawing.imaging

0
推荐指数
1
解决办法
2061
查看次数

512x512 bmp图像如何拥有1MB的大小

我保存bmp格式的代码:

ImgResult.Save(dlgSavePicture.FileName, System.Drawing.Imaging.ImageFormat.Bmp)

我已经尝试了代码,输出是一个512x512 bmp图像,大小为1兆字节

如果我使用ms paint创建一个515x512 bmp图像,大小为768kb

我试图打开图像并重新保存为bmp,大小仍为1MB

512x512的512x512 bmp图像大小可达1mb吗?或者我的代码有问题?

vb.net bmp system.drawing.imaging

0
推荐指数
1
解决办法
1126
查看次数