Italian Immagine scattata corrotta? come devo scattare?

claudio984

New Member
Ciao a tutti,
da premettere che è pochissimo che sto approcciando con basic4android e grazie a questo fantastico forum sono riuscito a entrare subito nel vivo della programmazione :)
Vi espongo il mio problema:
vorrei capire come scattare una foto, salvarla ed utilizzarla in una listview.
Dai post che ho trovato sono riuscito a trovare qualche esempio e in qualche modo riesco a scattare la foto ma questa sembra non essere compatibile con la listview.
La listview che vado ad implementare quando va a pescare la foto che ho scattato non la carica ma lascia lo spazio vuoto, mentre tutte le altre foto che ho che ho scattato dalla fotocamera nativa vengono caricate alla perfezione.
E' come se il file jpg che produce fosse corrotto, infatti se apro sul pc la foto scattata riesco a visualizzarla a metà nel senso che una parte è grigia e un'altra parte contiene un pezzo di foto
Potrebbe essere un problema di librerie?
Mi postereste un esempio di codice?
Grazie mille per la disponibilità, spero di essere stato chiare nell'esposizione
Claudio
 

claudio984

New Member
piccolo aggiornamento, le foto non risultano più corrotte ma continuano a non essere visualizzate nella listview :(
Chi mi può aiutare??

questo è il codice attuale:
B4X:
Sub Process_Globals
    'These global variables will be declared once when the application starts.
    'These variables can be accessed from all modules.
  
End Sub

Sub Globals
    'These global variables will be redeclared each time the activity is created.
    'These variables can only be accessed from this module.
Dim camera1 As AdvancedCamera
    Dim panel1 As Panel
    Dim p As Phone
    Dim Button_Scatta As Button
End Sub

Sub Activity_Create(FirstTime As Boolean)
    'Do not forget to load the layout file created with the visual designer. For example:
    Activity.LoadLayout("layou_foto")
    camera1.Initialize(panel1, "camera1")
    p.SetScreenOrientation (1)
End Sub

Sub Activity_Resume

End Sub

Sub Activity_Pause (UserClosed As Boolean)
camera1.StopPreview
    camera1.Release
End Sub
Sub Camera1_Ready (Success As Boolean)
  If Success Then
      camera1.StartPreview
  Else
      ToastMessageShow("Cannot open camera.", True)
  End If
End Sub
Sub Camera1_PictureTaken (Data() As Byte)
  camera1.StartPreview
  Dim out As OutputStream
  out = File.OpenOutput(File.DirRootExternal, "Camera_1.jpg" , False)
  out.WriteBytes(Data, 0, Data.Length)
  out.Close
  ToastMessageShow("IMMAGINE SALVATA: " & File.Combine(File.DirRootExternal, "1.jpg"), True)
  Button_Scatta.Enabled = True
End Sub

Sub Button_Scatta_Click
    Button_Scatta.Enabled = False
    camera1.TakePicture
End Sub
 

claudio984

New Member
Risolto!
ridimensiono l'immagine ogni volta che vado ad aggiungerle un elemento nella listview.
Se può tornare utile a qualcuno questo è il codice:

B4X:
Dim bmp As Bitmap
    Dim out As OutputStream
    bmp= LoadBitmapSample(File.DirRootExternal,"1.jpg",280,150)
    out = File.OpenOutput(File.DirRootExternal,"1.Jpg", False)
    bmp.WriteToStream(out, 100, "JPEG")
 

AlpVir

Well-Known Member
Licensed User
Longtime User
@claudio894
Ho letto che hai risolto i tuoi problemi. Tuttavia, se lo scopo tuo è solo quello di caricare delle piccole immagini in una listview il tuo processo spreca risorse. Tu prima scatti una foto (da - poniamo - 3 MB) e poi la riduci a 280x150 pixel). Occupi cioè un sacco di byte sul tuo HD (si fa per dire).
Conviene :
1) scattare
2) ridurre
3) salvare
4) visualizzare.
Prova ad usare la libreria ACL 4.6, pen più potente e versatile. Esiste peraltro anche CameraEx, altro modo di approciare la fotocamera.
Questa comunque, a mio giudizio, è la migliore :
http://www.b4x.com/android/help/acl.html
in cui puoi impostare la larghezza e l'altezza dell'immagine, senza sprechi
B4X:
camera1.PictureSize (MaxLarghezza,MaxAltezza)
camera1.StartPreview
Poi in PictureTaken :
B4X:
Sub Camera1_PictureTaken (Data() As Byte)
    Dim B        As Bitmap
    Dim out      As OutputStream
    camera1.StartPreview
    out = File.OpenOutput(File.DirRootExternal, NomeImgTemp, False)
    B.WriteToStream(out, 100, "JPEG")
    out.Close
End Sub
 
Top