Frage

Ich versuche herauszufinden, wie ich mit FJCORE eine Schreibensabbitmap für einen JPEG codieren kann. Ich verstehe, dass die Schreibensabteilung die rohen Pixel liefert, aber ich bin mir nicht sicher, wie ich es in das Format umwandeln soll, das Fjcore für seine JPeGenCoder -Methode erwartet. JPeGenCoder hat zwei Überladungen, einer nimmt einen fluxjpeg.core.image und der andere in ein decodedjpeg.

Ich habe versucht, einen Fluxjpeg.core.image zu erstellen, aber es erwartet ein Byte [] [] [,] für die Bilddaten. Byte [n] [x, y] wobei x Breite ist und y Höhe, aber ich weiß nicht, was N sein sollte.

Ich dachte, dass N 4 sein sollte, da dies den in jedem Pixel codierten ARGB -Info entsprechen würde, aber als ich es versuchte, wirft Fjcore ein Argument außerhalb der Reichweite aus. Hier ist, was ich versucht habe. Raster ist mein 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);
War es hilfreich?

Lösung

Herausgefunden! Ich habe heruntergeladen Fjcore von code.google.com und ging durch die Bildklasse. Es erwartet nur die RGB -Bytes. Hier ist die Funktion, die ich geschrieben habe. Ich brauche die Base64 -Version des Bildes, also kehrt meine Funktion zurück.

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

Andere Tipps

Dieser Code ist in Ordnung und sollte funktionieren. Ich verwende denselben Code, um einen Bildstrom über Webdienst an den Server zu senden und mit diesen Bytes das Bild zu regenerieren. Sie können diese Bytes auch in DB speichern

 [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 !";
 }

Klingt so, als ob [n] das Byte-Array des Bildes sein sollte. Ich habe mich mit der Codierung der Schreibensable in ein JPEG eingesetzt und dieselbe Bibliothek gefunden, aber nicht im Detail geprüft, sondern davon ausgeht Später zu dieser Antwort, um zu sehen, ob dies funktioniert, da ich noch nicht die Möglichkeit habe, es zu versuchen. Es wird eine Methode geben, um die Bytes einer beschreibbaren Bitbitmap in Silverlight zu erhalten. Ich denke, es ist möglich, andere Typen zu speichern.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top