2014-04-08 11 views
10

Una delle funzioni Sono in esecuzione: image.Decode()Differenza tra [] uint8 && [] byte (Golang fette)

La funzione image.Decode prende in un io.Reader & & e l'io. La funzione Reader accetta un [] byte.

Quando passo in un uint8 [], se mi dà questo errore:

panic: image: unknown format 

Come posso convertire l'uint8 [] a [] byte?

UPDATE

L'errore si verifica nell'area riservata perché image.Decode non può leggere la variabile xxx.

package main 

    import (
     "github.com/nfnt/resize" 
     "image" 
     "image/jpeg" 
     "fmt" 
     "launchpad.net/goamz/aws" 
     "launchpad.net/goamz/s3" 
     "bytes" 
     "encoding/json" 
     "io/ioutil" 
     "os" 
     "reflect" 
    ) 

    type Data struct { 
     Key string 
    } 

    func main() { 

     useast := aws.USEast 

     connection := s3.New(auth, useast) 
     mybucket := connection.Bucket("bucketName") 

     image_data, err := mybucket.Get("1637563605030") 

     if err != nil { 
     panic(err.Error()) 
     } else { 
     fmt.Println("success") 
     } 

     xxx := []byte(image_data) 

     ******* THIS IS WHERE THE ERROR OCCURS ************** 

     original_image, _, err := image.Decode(bytes.NewReader(xxx)) 

     ******* THIS IS WHERE THE ERROR OCCURS END ************** 

     if err != nil { 
     fmt.Println("Shit") 
     panic(err.Error()) 
     } else { 
     fmt.Println("Another success") 
     } 

     new_image := resize.Resize(160, 0, original_image, resize.Lanczos3) 

     if new_image != nil { 
     fmt.Println("YAY") 
     } 
    } 
+1

È possibile fornire esempi di immagini e codici? Non penso che [] uint8 sia il problema, ad es. questo funziona: http://play.golang.org/p/PXxN-iLeuB – Kluyg

risposta

30

The Go Programming Language Specification

Numeric types

uint8  the set of all unsigned 8-bit integers (0 to 255) 

byte  alias for uint8 

package main 

import "fmt" 

func ByteSlice(b []byte) []byte { return b } 

func main() { 
    b := []byte{0, 1} 
    u8 := []uint8{2, 3} 
    fmt.Printf("%T %T\n", b, u8) 
    fmt.Println(ByteSlice(b)) 
    fmt.Println(ByteSlice(u8)) 
} 

uscita:

[]uint8 []uint8 
[0 1] 
[2 3] 

Hai mal diagnosticato il tuo problema.

+2

+1 per la citazione dei documenti. –

6

Come hanno spiegato le altre risposte, non è un problema passare un []uint8 dove è richiesto un []byte. Se questo fosse il tuo problema, avresti ricevuto un errore in fase di compilazione. Non lo sei. Un panico è un errore di runtime e viene generato dalla libreria di immagini quando legge i dati nella sezione.

Infatti, la libreria di immagini è solo parzialmente il tuo problema. Vedi http://golang.org/src/pkg/image/format.go. Restituisce un messaggio di errore perché non riconosce il formato dell'immagine dei dati nella sezione. Il tuo codice, che chiama image.Decode(), sta chiamando panic quando image.Decode() restituisce il messaggio di errore.

+0

@JorgeOlivero è necessario aver memorizzato qualcosa che non era un'immagine (o che non era in un formato riconosciuto dalla libreria Go) in quel bucket in S3. –