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 - Lettura dati  Tiff
Forum - C# / VB.NET - Lettura dati Tiff

Avatar
bernie (Normal User)
Pro


Messaggi: 164
Iscritto: 23/10/2019

Segnala al moderatore
Postato alle 12:24
Sabato, 02/12/2023
Salve a tutti
Devo creare un Tiff partendo delle dimensioni di un altro Tiff.
Riesco a creare il Tiff  usando una libreria , però non riesco a prendere i tag del Tiff esistente e usarli per creare il secondo Tiff.
Allego quello che ho fatto fino ad ora

Codice sorgente - presumibilmente VB.NET

  1. Imports BitMiracle.LibTiff.Classic
  2. Public Class Form1
  3.     Dim larghezza, altezza As Int32
  4.     Dim risoluzione_x, risoluzione_y As Int32
  5.     Dim valore As Int32
  6.  
  7.  
  8.     Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
  9.         My.Computer.FileSystem.CreateDirectory("C:\Maschere")
  10.  
  11.         larghezza = 1000
  12.         altezza = 1000
  13.         risoluzione_x = 400
  14.         risoluzione_y = 400
  15.  
  16.         Using tif As Tiff = Tiff.Open("C:\Maschere\test.tiff", "w")
  17.             Using origine As Tiff = Tiff.Open("C:\Maschere\origine.tiff", "r")
  18.                 Dim largo As FieldValue()
  19.                 Dim alto As FieldValue()
  20.                 alto  = origine.GetField(TiffTag.IMAGELENGTH)                            'leggo la altezza del file originale
  21.                 largo = origine.GetField(TiffTag.IMAGEWIDTH)                             'leggo la larghezza del file originale
  22.                
  23.                 tif.SetField(TiffTag.IMAGEWIDTH, larghezza)
  24.                 tif.SetField(TiffTag.IMAGELENGTH, altezza)
  25.                 tif.SetField(TiffTag.BITSPERSAMPLE, 2)
  26.                 tif.SetField(TiffTag.SAMPLESPERPIXEL, 1)
  27.                 tif.SetField(TiffTag.PHOTOMETRIC, Photometric.MINISWHITE)
  28.                 tif.SetField(TiffTag.PLANARCONFIG, PlanarConfig.CONTIG)
  29.                 tif.SetField(TiffTag.ROWSPERSTRIP, tif.DefaultStripSize(1))
  30.                 tif.SetField(TiffTag.XRESOLUTION, risoluzione_x)
  31.                 tif.SetField(TiffTag.YRESOLUTION, risoluzione_y)
  32.                 tif.SetField(TiffTag.RESOLUTIONUNIT, ResUnit.INCH)
  33.                 tif.SetField(TiffTag.STRIPOFFSETS, 0)
  34.                 tif.SetField(TiffTag.STRIPBYTECOUNTS, 1)
  35.  
  36.  
  37.                 Dim buf_originale As Byte() = New Byte(larghezza - 1) {}            'dichiaro  il buffer dal file originale
  38.                 Dim buf As Byte() = New Byte(larghezza - 1) {}                      'dichiaro il buffer del nuovo file
  39.                 For i As Integer = 0 To altezza - 1                                 'scansiono l'altezza
  40.                     For j As Integer = 0 To larghezza - 1                           'scansiono la larghezza  
  41.                         origine.ReadScanline(buf_originale, i)                      'leggo la riga "i" dal file originale
  42.                         valore = Buffer.GetByte(buf_originale, j)                   'leggo il singolo valore del byte della riga "i" originale
  43.                        
  44.                         Buffer.SetByte(buf, j, valore)                             'scrivo il valore nel nuovo buffer
  45.                     Next
  46.                     tif.WriteScanline(buf, i)                                       'scrivo il buffer nel nuovo file
  47.                 Next
  48.             End Using
  49.         End Using
  50.         MsgBox("Maschera Creata in C:\Maschere")
  51.     End Sub
  52. End Class



La mia idea era di usare le variabili largo e alto per settare le variabili larghezza e altezza.
Mi da sempre errore  BC30311 non è possibile convertire il valore di tipo FieldValue() in Integer
Qualche consiglio ?
Grazie

Ultima modifica effettuata da bernie il 02/12/2023 alle 12:36
PM Quote
Avatar
Carlo (Member)
Guru


Messaggi: 1349
Iscritto: 29/01/2018

Segnala al moderatore
Postato alle 14:47
Sabato, 02/12/2023
Non conoscendo la libreria non ti so dare una risposta precisa.

Dove hai l'errore sulle dichiarazioni?:

Dim largo As FieldValue()
Dim alto As FieldValue()

oppure sulle assegnazioni?:

alto  = origine.GetField(TiffTag.IMAGELENGTH)                            'leggo la altezza del file originale
largo = origine.GetField(TiffTag.IMAGEWIDTH)                             'leggo la larghezza del file originale


VB dovrebbe fare le conversioni di tipo in modo implicito, perché di default è settato su Option Strict Off, se la conversione non avviene, con il debug si può andare a vedere il tipo ed istruire il compilatore sulla conversione da fare.

Puoi provare a dichiarare la tua variabile largo come oggetto:

Dim largo As Object()
e metti il dato (sempre se è possibile, non conosco le istruzioni della libreria)
largo = origine.GetField(TiffTag.IMAGEWIDTH)

ora in largo hai un oggetto con un valore che puoi convertire in intero (solo se si può)

Dim w As Integer = CType(largo, Integer) ' in w la larghezza

Fine prova.

Ti consiglio di mettere all'inizio del tuo programma: Option Strict On, vedrai quante volte hai delegato VB nella conversione dei tipi. Comodo ma ti ha reso sempre inconsapevole di una parte essenziale della programmazione, per esempio in C# il programmatore deve sempre convertire i tipi.
Con l'istruzione: Option Strict On rendi VB simile a C#, facendoti consapevole del tipo di dati che stai manipolando.

Uscendo dalla libreria per sapere la larghezza e l'altezza di un tif o qualsiasi immagine:

Codice sorgente - presumibilmente VB.NET

  1. Dim bmp As Image = Bitmap.FromFile("C:\Maschere\origine.tiff")
  2. Dim h As Integer = bmp.Height
  3. Dim w As Integer = bmp.Width







in programmazione tutto è permesso
PM Quote
Avatar
bernie (Normal User)
Pro


Messaggi: 164
Iscritto: 23/10/2019

Segnala al moderatore
Postato alle 14:55
Sabato, 02/12/2023
Ciao Carlo
L'errore l'ho quando provo a scrivere
altezza= alto.
Adesso provo a farlo fuori libreria.
Anche se la libreria mi permette di leggere anche altri tag che mi servono.
Ma questo forse lo posso aggirare.
Grazie

PM Quote
Avatar
Carlo (Member)
Guru


Messaggi: 1349
Iscritto: 29/01/2018

Segnala al moderatore
Postato alle 15:31
Sabato, 02/12/2023
altezza = CType(alto, Int32)

se hai ancora errore significa che in alto non c'è un valore convertibile in Int32, alto è un oggetto di tipo FieldValue() e magari devi screvere alto.IMAGELENGTH per l'altezza e alto.IMAGEWIDTH per la larghezza come si evince da altre parti del tuo codice, o simile, vedi cosa ti da l'intellisense.


Ultima modifica effettuata da Carlo il 02/12/2023 alle 15:44


in programmazione tutto è permesso
PM Quote
Avatar
bernie (Normal User)
Pro


Messaggi: 164
Iscritto: 23/10/2019

Segnala al moderatore
Postato alle 16:10
Sabato, 02/12/2023
Ho provato le modifiche suggerite da Carlo ma il problema sussiste.
Quindi opto per la soluzione fuori libreria che funziona.

PM Quote
Avatar
bernie (Normal User)
Pro


Messaggi: 164
Iscritto: 23/10/2019

Segnala al moderatore
Postato alle 16:49
Sabato, 02/12/2023
Si, è un FieldValue().
Ho messo all'inizio del programma Opion Strict On, questa volta ho avuto fortuna, solo la variabile "valore"mi dava errore.

PM Quote
Avatar
Carlo (Member)
Guru


Messaggi: 1349
Iscritto: 29/01/2018

Segnala al moderatore
Postato alle 17:12
Sabato, 02/12/2023
Testo quotato

Postato originariamente da bernie:

Si, è un FieldValue().
Ho messo all'inizio del programma Opion Strict On, questa volta ho avuto fortuna, solo la variabile "valore"mi dava errore.



con l'intellisense quando scrivi alto. alla scrittura del punto ti compare l'elenco delle proprietà usabili?
Guarda l'elenco e controlla se c'è un nome riconducible all'altezza.
L'altezza potrebbe essere una sottoproprietà, magari nell'elenco c'é: Dimension
Allora scrivi: alto.Dimension. alla scriitura del secondo punto compare un'altro elenco dove ci potrebbe essere Height, se così fosse l'intero usabile sarebbe sotto a: alto.Dimension.Height.

Ho fatto una ricerca e ho trovato che per sapere le dimensioni usando la libreria BitMiracle.LibTiff.Classic si fa così:

dopo aver indicato l'immagine con:
Dim origine As TiffImage = New TiffImage("C:\Maschere\origine.tiff")

Dim w As Integer = origine.GetWidth()
Dim h As Integer = origine.GetHeight()

Non sono in grado di controllare se è vero.

Ultima modifica effettuata da Carlo il 02/12/2023 alle 21:41


in programmazione tutto è permesso
PM Quote
Avatar
bernie (Normal User)
Pro


Messaggi: 164
Iscritto: 23/10/2019

Segnala al moderatore
Postato alle 9:42
Domenica, 03/12/2023
Buongiorno
Ho provato come suggerito da Carlo , ma non sono riuscito a farlo funzionare , quindi ho modificato come di seguito
Codice sorgente - presumibilmente VB.NET

  1. Using origine As Tiff = Tiff.Open("C:\Maschere\origine.tiff", "r")
  2.                 Dim larghezza_a() As FieldValue
  3.                 Dim altezza_a() As FieldValue
  4.                 larghezza_a = origine.GetField(TiffTag.IMAGEWIDTH)
  5.                 altezza_a = origine.GetField(TiffTag.IMAGELENGTH)
  6.                 Dim larghezza As Integer = larghezza_a(0).ToInt()
  7.                 Dim altezza As Integer = altezza_a(0).ToInt()


Dalle prove fatte fino ad ora funziona .
Grazie

PM Quote