문제

FJCore를 사용하여 jpeg에 Writ Writ JPEGENCODER에는 두 개의 과부하가 있으며, 하나는 fluxjpeg.core.image를 사용하고 다른 하나는 디코드로드 JPEG에서 가져갑니다.

fluxjpeg.core.image를 만들려고했지만 이미지 데이터에 대한 바이트 [] []를 기대합니다. 바이트 [n] [x, y] 여기서 x는 너비이고 y는 높이이지만 n이 무엇인지 모르겠습니다.

나는 n이 각 픽셀에서 인코딩 된 ArgB 정보에 해당하기 때문에 n이 4 여야한다고 생각했지만 fjcore가 범위 예외에서 인수를 던지는 것을 시도했을 때. 여기 내가 시도한 것이 있습니다. 래스터는 내 바이트 [4] [x, y] 배열입니다.

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);
도움이 되었습니까?

해결책

그것을 알아 냈습니다! 나는 다운로드했다 code.google.com의 fjcore 이미지 클래스를 통과했습니다. RGB 바이트 만 기대합니다. 내가 쓴 기능은 다음과 같습니다. 이미지의 Base64 버전이 필요하므로 기능이 반환됩니다.

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

다른 팁

이 코드는 괜찮으며 작동해야합니다. 동일한 코드를 사용하여 웹 서비스를 통해 이미지 스트림을 서버로 보내고 이러한 바이트를 사용하여 이미지를 재생하는 것 보다이 바이트를 DB에 저장할 수도 있습니다.

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

n]은 이미지의 바이트 배열이어야합니다. 나는 writ 나중에이 답변을 얻으십시오. 아직 시도해 볼 기회가 없었기 때문에 이것이 효과가 있는지 확인하십시오. Silverlight에서 WritableBittMap의 바이트를 얻는 방법이 있습니다. 다른 유형에 저장할 수 있기 때문입니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top