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
Grazie per ogni suggerimento
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