Questo sito utilizza cookies solo per scopi di autenticazione sul sito e nient'altro. Nessuna informazione personale viene tracciata. Leggi l'informativa sui cookies.
Username: Password: oppure
C# / VB.NET - Convertire Bit per pixel file Tiff
Forum - C# / VB.NET - Convertire Bit per pixel file Tiff

Avatar
bernie (Normal User)
Pro


Messaggi: 164
Iscritto: 23/10/2019

Segnala al moderatore
Postato alle 17:55
Sabato, 09/12/2023
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
Codice sorgente - presumibilmente VB.NET

  1. Option Strict On    
  2. Imports BitMiracle.LibTiff.Classic
  3. Public Class Form1
  4.     Dim risoluzione_x, risoluzione_y As Int32
  5.     Dim valore_originale, valore, valore_temp As Byte                                            'valore del byte nel buffer nuovo file  e originale  
  6.     Dim BPP As Int32                                                          'valore Bit per Pixel
  7.     Dim ripetizioni As Int32                                                        'Numero di ripetizioni in base a quanti BPP servono
  8.     Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
  9.  
  10.        
  11.         If RadioButton3.Checked = True Then
  12.             BPP = 1
  13.         ElseIf RadioButton4.Checked = True Then
  14.             BPP = 2
  15.         ElseIf RadioButton5.Checked = True Then
  16.             BPP = 4
  17.         ElseIf RadioButton6.Checked = True Then
  18.             BPP = 8
  19.         End If
  20.         Using tif As Tiff = Tiff.Open("C:\Maschere\Convertito.tiff", "w")
  21.             Using origine As Tiff = Tiff.Open("C:\Maschere\origine.tiff", "r")
  22.  
  23.                 Dim larghezza_a() As FieldValue
  24.                 larghezza_a = origine.GetField(TiffTag.IMAGEWIDTH)
  25.                 Dim larghezza As Integer = larghezza_a(0).ToInt()
  26.  
  27.                 Dim altezza_a() As FieldValue
  28.                 altezza_a = origine.GetField(TiffTag.IMAGELENGTH)
  29.                 Dim altezza As Int32 = altezza_a(0).ToInt()
  30.  
  31.                 Dim bitpixel_a() As FieldValue
  32.                 bitpixel_a = origine.GetField(TiffTag.BITSPERSAMPLE)
  33.                 Dim bitpixel As Integer = bitpixel_a(0).ToInt()
  34.  
  35.                 Dim risoluzione_x_origine_a() As FieldValue
  36.                 risoluzione_x_origine_a = origine.GetField(TiffTag.XRESOLUTION)
  37.                 Dim risoluzione_x_origine As Integer = risoluzione_x_origine_a(0).ToInt
  38.  
  39.                 Dim risoluzione_y_origine_a() As FieldValue
  40.                 risoluzione_y_origine_a = origine.GetField(TiffTag.YRESOLUTION)
  41.                 Dim risoluzione_y_origine As Integer = risoluzione_y_origine_a(0).ToInt
  42.  
  43.  
  44.                 Label1.Text = ("HorizontalResolution =" & risoluzione_x_origine & " DPI")
  45.                 Label2.Text = ("VerticalResolution =" & risoluzione_y_origine & " DPI")
  46.                 Label3.Text = ("Width px =" & larghezza)
  47.                 Label4.Text = ("Height px =" & altezza)
  48.                 Label5.Text = ("Bit Pixel =" & bitpixel)
  49.                
  50.                 If origine Is Nothing Then
  51.                     MsgBox("File origine non trovato")
  52.                     Return
  53.                 End If
  54.                
  55.                 tif.SetField(TiffTag.IMAGEWIDTH, larghezza)
  56.                 tif.SetField(TiffTag.IMAGELENGTH, altezza)
  57.                 tif.SetField(TiffTag.BITSPERSAMPLE, BPP)
  58.                 tif.SetField(TiffTag.SAMPLESPERPIXEL, 1)
  59.                 tif.SetField(TiffTag.PHOTOMETRIC, Photometric.MINISWHITE)
  60.                 tif.SetField(TiffTag.PLANARCONFIG, PlanarConfig.CONTIG)
  61.                 tif.SetField(TiffTag.ROWSPERSTRIP, tif.DefaultStripSize(1))
  62.                 tif.SetField(TiffTag.XRESOLUTION, risoluzione_x_origine)
  63.                 tif.SetField(TiffTag.YRESOLUTION, risoluzione_y_origine)
  64.                 tif.SetField(TiffTag.RESOLUTIONUNIT, ResUnit.INCH)
  65.                 tif.SetField(TiffTag.STRIPOFFSETS, 0)
  66.                 tif.SetField(TiffTag.STRIPBYTECOUNTS, 1)
  67.                
  68.                 Dim ppb As Int32 = CInt(8 / BPP)                                    'pixel che verranno messi in un byte
  69.                 Dim indice As Int32                                                 'indice
  70.                 Dim buf_originale As Byte() = New Byte(larghezza - 1) {}            'dichiaro il buffer dal file originale
  71.                 Dim buf As Byte() = New Byte(larghezza - 1) {}                      'dichiaro il buffer del nuovo file
  72.                 For i As Integer = 0 To altezza - 1                                 'scansiono l'altezza
  73.                     origine.ReadScanline(buf_originale, i)                          'leggo la riga "i" dal file originale
  74.                     For j As Integer = 0 To larghezza - 1 Step ppb                  'scansiono la larghezza a passi
  75.                         For ripetizioni = 0 To ppb - 1
  76.                             indice = ripetizioni + j
  77.                             valore_originale = (Buffer.GetByte(buf_originale, indice))       'leggo il singolo valore dei byte della riga "i" originale
  78.                             valore_temp = (valore_originale) >> (8 - BPP)                    'converto il valore letto a 8 BPP nel valore di BPP voluto
  79.                             valore = valore Or (valore_temp) << (BPP * indice)
  80.                         Next
  81.                         Buffer.SetByte(buf, j, valore)                              'scrivo il valore nel nuovo buffer
  82.                         valore = 0
  83.                     Next
  84.                     tif.WriteScanline(buf, i)                                       'scrivo il buffer nel nuovo file
  85.                 Next
  86.             End Using
  87.         End Using
  88.         MsgBox("File Convertito ")
  89.     End Sub
  90. End Class



Grazie per ogni suggerimento

PM Quote
Avatar
nessuno (Normal User)
Guru^2


Messaggi: 6405
Iscritto: 03/01/2010

Segnala al moderatore
Postato alle 13:40
Giovedì, 14/12/2023
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à.
PM Quote
Avatar
Thejuster (Admin)
Guru^2


Messaggi: 2308
Iscritto: 04/05/2008

Segnala al moderatore
Postato alle 7:32
Venerdì, 15/12/2023
messaggio di spam eliminato


https://mire.forumfree.it/ - Mire Engine
C# UI Designer
PM Quote