Oppure

Loading
09/12 16:55
bernie
Salve, adesso che riesco a leggere i tag di un file Tiff e utilizzarli per scrivere un altro file , avrei bisogno di convertire i Bit per pixel da 8 a 4 o 2 o 1 . Il file è un greyscale quindi niente palette.
Il file originale è 8BPP, quindi pensavo di leggere 4 pixel , convertire il valore e poi riscriverlo in un byte .
Allego quello che ho fatto fino ad ora .
Usando come origine un file a campo pieno , mi crea un file con tutte righe verticali equidistanti. Questo mi fa pensare che sto sbagliando qualcosa nello shift dei bit , ma non riesco a capire cosa .
Ogni suggerimento è ben accetto
Grazie
Option Strict On    
Imports BitMiracle.LibTiff.Classic
Public Class Form1
    Dim risoluzione_x, risoluzione_y As Int32
    Dim valore_originale, valore, valore_temp As Byte                                            'valore del byte nel buffer nuovo file  e originale  
    Dim BPP As Int32                                                          'valore Bit per Pixel
    Dim ripetizioni As Int32                                                        'Numero di ripetizioni in base a quanti BPP servono 
    Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click

       
        If RadioButton3.Checked = True Then
            BPP = 1
        ElseIf RadioButton4.Checked = True Then
            BPP = 2
        ElseIf RadioButton5.Checked = True Then
            BPP = 4
        ElseIf RadioButton6.Checked = True Then
            BPP = 8
        End If
        Using tif As Tiff = Tiff.Open("C:\Maschere\Convertito.tiff", "w")
            Using origine As Tiff = Tiff.Open("C:\Maschere\origine.tiff", "r")

                Dim larghezza_a() As FieldValue
                larghezza_a = origine.GetField(TiffTag.IMAGEWIDTH)
                Dim larghezza As Integer = larghezza_a(0).ToInt()

                Dim altezza_a() As FieldValue
                altezza_a = origine.GetField(TiffTag.IMAGELENGTH)
                Dim altezza As Int32 = altezza_a(0).ToInt()

                Dim bitpixel_a() As FieldValue
                bitpixel_a = origine.GetField(TiffTag.BITSPERSAMPLE)
                Dim bitpixel As Integer = bitpixel_a(0).ToInt()

                Dim risoluzione_x_origine_a() As FieldValue
                risoluzione_x_origine_a = origine.GetField(TiffTag.XRESOLUTION)
                Dim risoluzione_x_origine As Integer = risoluzione_x_origine_a(0).ToInt

                Dim risoluzione_y_origine_a() As FieldValue
                risoluzione_y_origine_a = origine.GetField(TiffTag.YRESOLUTION)
                Dim risoluzione_y_origine As Integer = risoluzione_y_origine_a(0).ToInt


                Label1.Text = ("HorizontalResolution =" & risoluzione_x_origine & " DPI")
                Label2.Text = ("VerticalResolution =" & risoluzione_y_origine & " DPI")
                Label3.Text = ("Width px =" & larghezza)
                Label4.Text = ("Height px =" & altezza)
                Label5.Text = ("Bit Pixel =" & bitpixel)
                
                If origine Is Nothing Then
                    MsgBox("File origine non trovato")
                    Return
                End If
                
                tif.SetField(TiffTag.IMAGEWIDTH, larghezza)
                tif.SetField(TiffTag.IMAGELENGTH, altezza)
                tif.SetField(TiffTag.BITSPERSAMPLE, BPP)
                tif.SetField(TiffTag.SAMPLESPERPIXEL, 1)
                tif.SetField(TiffTag.PHOTOMETRIC, Photometric.MINISWHITE)
                tif.SetField(TiffTag.PLANARCONFIG, PlanarConfig.CONTIG)
                tif.SetField(TiffTag.ROWSPERSTRIP, tif.DefaultStripSize(1))
                tif.SetField(TiffTag.XRESOLUTION, risoluzione_x_origine)
                tif.SetField(TiffTag.YRESOLUTION, risoluzione_y_origine)
                tif.SetField(TiffTag.RESOLUTIONUNIT, ResUnit.INCH)
                tif.SetField(TiffTag.STRIPOFFSETS, 0)
                tif.SetField(TiffTag.STRIPBYTECOUNTS, 1)
               
                Dim ppb As Int32 = CInt(8 / BPP)                                    'pixel che verranno messi in un byte
                Dim indice As Int32                                                 'indice 
                Dim buf_originale As Byte() = New Byte(larghezza - 1) {}            'dichiaro il buffer dal file originale 
                Dim buf As Byte() = New Byte(larghezza - 1) {}                      'dichiaro il buffer del nuovo file
                For i As Integer = 0 To altezza - 1                                 'scansiono l'altezza 
                    origine.ReadScanline(buf_originale, i)                          'leggo la riga "i" dal file originale
                    For j As Integer = 0 To larghezza - 1 Step ppb                  'scansiono la larghezza a passi 
                        For ripetizioni = 0 To ppb - 1
                            indice = ripetizioni + j
                            valore_originale = (Buffer.GetByte(buf_originale, indice))       'leggo il singolo valore dei byte della riga "i" originale 
                            valore_temp = (valore_originale) >> (8 - BPP)                    'converto il valore letto a 8 BPP nel valore di BPP voluto
                            valore = valore Or (valore_temp) << (BPP * indice)
                        Next
                        Buffer.SetByte(buf, j, valore)                              'scrivo il valore nel nuovo buffer 
                        valore = 0
                    Next
                    tif.WriteScanline(buf, i)                                       'scrivo il buffer nel nuovo file 
                Next
            End Using
        End Using
        MsgBox("File Convertito ")
    End Sub
End Class




Grazie per ogni suggerimento
aaa
14/12 12:40
nessuno
Spam spam spam
Ricorda che nessuno è obbligato a risponderti e che nessuno è perfetto ...
---
Il grande studioso italiano Bruno de Finetti ( uno dei padri fondatori del moderno Calcolo delle probabilità ) chiamava il gioco del Lotto Tassa sulla stupidità.
15/12 6:32
Thejuster
messaggio di spam eliminato
mire.forumfree.it/ - Mire Engine
C# UI Designer