Domanda

Sto cercando di scoprire come utilizzare FJCore per codificare un WriteableBitmap ad un jpeg. Capisco che WriteableBitmap fornisce i pixel prime ma non sono sicuro di come per convertirlo nel formato che FJCore si aspetta per il suo metodo di JpegEncoder. JpegEncoder ha due overload, si prende un FluxJpeg.Core.Image e l'altro prende in DecodedJpeg.

Stavo cercando di creare un FluxJpeg.Core.Image ma si aspetta un byte [] [,] per i dati di immagine. byte [n] [x, y] dove x è la larghezza e l'altezza è y, ma non so che cosa dovrebbe essere n.

ho pensato che n deve essere 4 in quanto ciò corrisponde alle informazioni argb codificati in ciascun pixel, ma quando ho provato che FJCore genera un argomento di eccezione gamma. Ecco quello che ho provato. Raster è mio byte [4] [x, y] array.

raster[0][x, y] = (byte)((pixel >> 24) & 0xFF);
raster[1][x, y] = (byte)((pixel >> 16) & 0xFF);
raster[2][x, y] = (byte)((pixel >> 8) & 0xFF);
raster[3][x, y] = (byte)(pixel & 0xFF);
È stato utile?

Soluzione

figured it out! Ho scaricato FJCore da code.google.com e passato attraverso la classe di immagine. Ci si aspetta solo i byte RGB. Ecco la funzione che ho scritto. Ho bisogno della versione Base64 dell'immagine in modo che è quello che riporta la mia funzione.

    private static string GetBase64Jpg(WriteableBitmap bitmap)
    {
        int width = bitmap.PixelWidth;
        int height = bitmap.PixelHeight;
        int bands = 3;
        byte[][,] raster = new byte[bands][,];

        for (int i = 0; i < bands; i++)
        {
            raster[i] = new byte[width, height];    
        }

        for (int row = 0; row < height; row++)
        {
            for (int column = 0; column < width; column++)
            {
                int pixel = bitmap.Pixels[width * row + column];
                raster[0][column, row] = (byte)(pixel >> 16);
                raster[1][column, row] = (byte)(pixel >> 8);
                raster[2][column, row] = (byte)pixel;
            }
        }

        ColorModel model = new ColorModel { colorspace = ColorSpace.RGB };
        FluxJpeg.Core.Image img = new FluxJpeg.Core.Image(model, raster);
        MemoryStream stream = new MemoryStream();
        JpegEncoder encoder = new JpegEncoder(img, 90, stream);
        encoder.Encode();

        stream.Seek(0, SeekOrigin.Begin);
        byte[] binaryData = new Byte[stream.Length];
        long bytesRead = stream.Read(binaryData, 0, (int)stream.Length);

        string base64String =
                System.Convert.ToBase64String(binaryData,
                                              0,
                                              binaryData.Length);

        return base64String;
    }

Altri suggerimenti

Questo codice è bene e dovrebbe funzionare. Sto usando lo stesso codice per inviare flusso di immagini al server tramite web service e di rigenerare immagine utilizzando questi byte ... è possibile salvare questi byte di Db anche

 [WebMethod]
 public string SaveImage(string data, string fileName)
 {
    byte[] imageBytes = System.Convert.FromBase64String(data);

    MemoryStream mem = new MemoryStream();
    mem.Write(imageBytes, 0, imageBytes.Length);

    System.Drawing.Image img = System.Drawing.Image.FromStream(mem);
    img.Save("D:\\FinalTest.jpg");      
    return "Saved !";
 }

Suona come [n] dovrebbe essere il byte-array dell'immagine, ho cercato in codifica WriteableBitmap in JPEG e trovarono la stessa libreria, ma non hanno esaminato in dettaglio, ma assumere questo sarebbe il caso, aggiungerà più tardi a questa risposta per vedere se questo funziona, come non ho avuto la possibilità di provare ancora. Ci sarà qualche metodo per ottenere i byte di un WritableBitmap in Silverlight immagino come è possibile salvare ad altri tipi.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top