2014-04-08 9 views
10

Jedną z funkcji ja trwających: image.Decode()Różnica [] uint8 && [] bajt (Golang plastry)

Funkcja image.Decode trwa w io.Reader & & i IO. Funkcja czytnika pobiera bajt [].

Kiedy mijam w [] uint8, jeśli daje mi ten błąd:

panic: image: unknown format 

Jak konwertować [] Uint8 na [] bajt?

UPDATE

Błąd występuje w zaznaczonym obszarze, ponieważ image.Decode nie może odczytać zmiennej 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

Czy możesz podać przykład obrazu i kodu? Nie sądzę, że problemem jest [] uint8, np. to działa: http://play.golang.org/p/PXxN-iLeuB – Kluyg

Odpowiedz

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)) 
} 

wyjściowa:

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

Masz błędną diagnozę problemu.

+2

+1 za cytowanie dokumentów. –

6

Jak wyjaśniono w innych odpowiedziach, nie ma problemu z przekazaniem []uint8 gdzie wymagane jest []byte. Gdyby to był twój problem, dostałbyś błąd podczas kompilacji. Nie jesteś. Panika jest błędem środowiska wykonawczego i jest zgłaszana przez bibliotekę obrazów, gdy odczytuje dane w wycinku.

W rzeczywistości biblioteka obrazów jest tylko częściowo Twoim problemem. Zobacz http://golang.org/src/pkg/image/format.go. Zwraca komunikat o błędzie, ponieważ nie rozpoznaje formatu obrazu danych w plasterku. Twój kod, który wywołuje image.Decode(), wywołuje panic, gdy zwraca komunikat o błędzie.

+0

@JorgeOlivero musisz przechowywać coś, co nie było obrazem (lub nie było w formacie rozpoznanym przez bibliotekę Go) w tym zasobniku w S3. –