【问题标题】:Save a picture in Tiff format without compression将图片保存为 Tiff 格式而不进行压缩
【发布时间】:2019-04-26 21:23:16
【问题描述】:

我刚刚发现 TIFF 有几种格式。使用时出于某种原因

Using bm As New Bitmap(rect.Width, rect.Width)
bm.Save("C:\testfolder\screenshot.png", Imaging.ImageFormat.Tiff)

格式变成了LZW压缩的,我不能在第三方库中使用。

经过一番搜索,我发现 .NET 确实提供了一个库来保存为具有不同压缩选项的 TIFF,我想尝试所有这些,但我不知道如何实现它。或者我应该说我没有弄清楚如何使用它:

https://docs.microsoft.com/en-us/dotnet/api/system.windows.media.imaging.tiffcompressoption?view=netframework-4.8#examples

目的是我想得到一个区域截图并保存为TIFF。

Dim stream As New FileStream("new.tif", FileMode.Create)
Dim encoder As New TiffBitmapEncoder()
encoder.Compression = TiffCompressOption.Zip
encoder.Frames.Add(BitmapFrame.Create(image))   <--what is this "image"?
encoder.Save(stream)

image 实体是什么?流?如何将截取的屏幕截图区域保存为 TIFF?

如果

Using bm As New Bitmap(rect.Width, rect.Width) 

我不介意先保存它然后只重新读取 bmp 流。唯一的问题是我不知道示例中给出的“图像”代表什么。

我从这里阅读了一些信息,但我仍然没有弄清楚: https://docs.microsoft.com/en-us/dotnet/api/system.windows.media.imaging.bitmapframe.create?view=netframework-4.8

如果你想通了,请给我一个如何使用代码的例子。

【问题讨论】:

  • bm 上面是 System.Drawing.Bitmap 而“图像”是 System.Windows.Media.Imaging.WriteableBitMap 我不知道如何实现它
  • 据记录,System.Windows 命名空间下的大多数成员(System.Windows.Forms 除外)是 WPF(不同的 GUI 框架)的一部分,通常不用于 WinForms。

标签: c# vb.net screenshot tiff


【解决方案1】:

您可以采用旧的 System.Drawing 方式而不是 System.Windows.Media 方式。

仅略微改编自 Encoder.Compression Field 的文档:

Imports System.Drawing.Imaging
'' .....

Private Shared Function GetEncoderInfo(ByVal mimeType As String) As ImageCodecInfo
    Dim j As Integer
    Dim encoders() As ImageCodecInfo
    encoders = ImageCodecInfo.GetImageEncoders()

    j = 0
    While j < encoders.Length
        If encoders(j).MimeType = mimeType Then
            Return encoders(j)
        End If
        j += 1
    End While
    Return Nothing

End Function

Sub SaveAsTiff()
    Dim sampleFile = "C:\temp\ToTiff.png"

    Using bmp = Image.FromFile(sampleFile)
        Dim myImageCodecInfo = GetEncoderInfo("image/tiff")

        Dim myEncoder As Imaging.Encoder = Imaging.Encoder.Compression
        Dim myEncoderParameters = New EncoderParameters(1)
        Dim myEncoderParameter = New EncoderParameter(myEncoder, EncoderValue.CompressionNone)
        myEncoderParameters.Param(0) = myEncoderParameter

        bmp.Save("C:\temp\ToTiff.tif", myImageCodecInfo, myEncoderParameters)

    End Using

End Sub

但是,它不允许 ZIP 压缩。但这对你来说可能无关紧要:Which TIFF image compression is better, LZW or ZIP?

此外,对于屏幕截图,您可能需要考虑使用 PNG 格式,尤其是在网络上使用图片时。

【讨论】:

  • “New EncoderParameters(1)”的质量太低。我想要 Tiff,因为我使用的库只指定了 Tiff 图像,这就是原因。这还没有解决我的问题,但很好的尝试
  • @EricSia 1 与质量无关 - 它是它将保存的参数数量。我展示的示例是未压缩的,即无损的。 LZW 和 ZIP 压缩也是无损的。
  • 我明白了。不幸的是,我想使用的第三方库不接受使用此方法默认使用 LZW 压缩的 Tiff 保存。
  • @EricSia 该代码未使用 LZW 压缩。正如EncoderValue.CompressionNone 所指定的,它不使用压缩。如果第三方库不接受未压缩的 TIFF,我会感到惊讶。
  • 编辑:是的,我的错,我检查了我刚才尝试的旧文件。我想你的回复解决了我的问题。谢谢哥们,我再试试看
猜你喜欢
  • 1970-01-01
  • 2012-10-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-04-24
  • 2010-09-21
  • 1970-01-01
相关资源
最近更新 更多