Сохранить картинку в формате Tiff без сжатия - PullRequest
1 голос
/ 26 апреля 2019

Я только что узнал, что 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

Пожалуйста, предложите мне пример использования кода, если вы его выяснили.

1 Ответ

1 голос
/ 26 апреля 2019

Вы можете перейти к более старому способу System.Drawing вместо System.Windows.Media.

Адаптировано незначительно из документации для поля кодирования . :

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. Но это может не иметь значения для вас: Какое сжатие изображений в формате TIFF лучше, LZW или ZIP?

Кроме того, для снимков экрана вы можете рассмотреть возможность использования формата PNG, особенно если изображения будут использоваться в Интернете.

...