将jpg数据从数据库保存到jpg文件中

时间:2022-05-07 21:19:48

I want to take the data in a field that contains a jpeg image and save it to an actual file that I can open with a paint editor. I know I could create an application to do this in c# but I'm wondering if there's a quick and easy way to just do it from a sql query?

我想在包含jpeg图像的字段中获取数据,并将其保存到实际文件中,我可以使用paint编辑器打开该文件。我知道我可以用c#创建一个应用程序来实现这一点,但是我想知道是否有一种快速简便的方法可以从sql查询中实现这一点?

It doesn't need to work on all records at once. I just need to be able to select a single record and save the image for that record to a file.

它不需要同时处理所有的记录。我只需要能够选择一个记录并将该记录的图像保存到一个文件中。

1 个解决方案

#1


0  

You can use MemoryStream object in C# as below

您可以在c#中使用MemoryStream对象,如下所示

MemoryStream memstmSignature = new MemoryStream(InkToBytes(ds.Tables[1].Rows[0]["SIGNATURE"].ToString(), "image/gif", 0, 0));
Image imaSig = Image.FromStream(memstmSignature);
imaSig.RotateFlip(RotateFlipType.Rotate180FlipX);
imaSig.Save(Path.Combine(this.temporaryFilePath, this.signatureFileName));
memstmSignature.Close();

Helper functions below private static byte[] InkToBytes(string inkStrokes, string encoderType, float x, float y) { ArrayList strokes = new ArrayList();

辅助函数在私有静态字节下面[]InkToBytes(string inkstroke, string encoderType, float x, float y) {ArrayList stroke = new ArrayList();

        // max size for bit map
        int maxX = 0;
        int maxY = 0;

        // intialize the strokes array with text string
        int strokesCount;
        if (inkStrokes.Length > 0)
        {
            if (inkStrokes.EndsWith(";"))
                inkStrokes = inkStrokes.Remove((inkStrokes.Length - 1), 1);

            char[] strokeSeperator = { ';' };
            string[] strokeArray = inkStrokes.Split(strokeSeperator);
            strokesCount = strokeArray.Length;

            for (int i = 0; i < strokesCount; i++)
            {
                Stroke stroke = new Stroke(50);
                stroke.Text = strokeArray[i];
                strokes.Add(stroke);

                Point[] points = stroke.ToPointArray();
                int len = points.Length;
                foreach (Point point in points)
                {
                    maxX = (point.X > maxX ? point.X : maxX);
                    maxY = (point.Y > maxY ? point.Y : maxY);
                }
            }
        }

        // setup the gdi objects
        Bitmap bitMap = new Bitmap(maxX + 20, maxY + 20); // leave some buffer room
        Graphics graphics = Graphics.FromImage(bitMap);
        Rectangle clientRect = new Rectangle(0, 0, bitMap.Width, bitMap.Height);
        Pen pen = new Pen(Color.Black);
        pen.Width = 2; // matches the client capture

        // draw the bit map
        if (x > 0 && y > 0)
            graphics.DrawImage(bitMap, x, y);
        else
            graphics.DrawImage(bitMap, 0, 0);
        graphics.FillRectangle(Brushes.White, clientRect);
        graphics.DrawRectangle(pen, clientRect);
        strokesCount = strokes.Count;
        for (int j = 0; j < strokesCount; j++)
        {
            Stroke stroke = (Stroke)strokes[j];
            if (stroke != null)
            {
                Point[] points = stroke.ToPointArray();
                int len = points.Length;
                if (len > 1)
                {
                    Point prevPoint = points[0];
                    for (int i = 1; i < len; i++)
                    {
                        graphics.DrawLine(pen, prevPoint.X, prevPoint.Y, points[i].X, points[i].Y);
                        prevPoint = points[i];
                    }
                }
            }
        }

        // create the bytes from the bitmap to be returned
        MemoryStream memStream = new MemoryStream(1000);
        ImageCodecInfo imageCodedInfo = GetEncoderInfo(encoderType);
        bitMap.Save(memStream, imageCodedInfo, null);
        byte[] bytes = memStream.GetBuffer();
        memStream.Close();
        return bytes;
    }

    private static ImageCodecInfo GetEncoderInfo(String mimeType)
    {
        int j;
        ImageCodecInfo[] encoders;
        encoders = ImageCodecInfo.GetImageEncoders();
        for (j = 0; j < encoders.Length; ++j)
        {
            if (encoders[j].MimeType == mimeType)
                return encoders[j];
        }
        return null;
    }

Hope this helps. NOTE: I have not looked into to optimizing the above code

希望这个有帮助。注意:我还没有考虑优化上面的代码

#1


0  

You can use MemoryStream object in C# as below

您可以在c#中使用MemoryStream对象,如下所示

MemoryStream memstmSignature = new MemoryStream(InkToBytes(ds.Tables[1].Rows[0]["SIGNATURE"].ToString(), "image/gif", 0, 0));
Image imaSig = Image.FromStream(memstmSignature);
imaSig.RotateFlip(RotateFlipType.Rotate180FlipX);
imaSig.Save(Path.Combine(this.temporaryFilePath, this.signatureFileName));
memstmSignature.Close();

Helper functions below private static byte[] InkToBytes(string inkStrokes, string encoderType, float x, float y) { ArrayList strokes = new ArrayList();

辅助函数在私有静态字节下面[]InkToBytes(string inkstroke, string encoderType, float x, float y) {ArrayList stroke = new ArrayList();

        // max size for bit map
        int maxX = 0;
        int maxY = 0;

        // intialize the strokes array with text string
        int strokesCount;
        if (inkStrokes.Length > 0)
        {
            if (inkStrokes.EndsWith(";"))
                inkStrokes = inkStrokes.Remove((inkStrokes.Length - 1), 1);

            char[] strokeSeperator = { ';' };
            string[] strokeArray = inkStrokes.Split(strokeSeperator);
            strokesCount = strokeArray.Length;

            for (int i = 0; i < strokesCount; i++)
            {
                Stroke stroke = new Stroke(50);
                stroke.Text = strokeArray[i];
                strokes.Add(stroke);

                Point[] points = stroke.ToPointArray();
                int len = points.Length;
                foreach (Point point in points)
                {
                    maxX = (point.X > maxX ? point.X : maxX);
                    maxY = (point.Y > maxY ? point.Y : maxY);
                }
            }
        }

        // setup the gdi objects
        Bitmap bitMap = new Bitmap(maxX + 20, maxY + 20); // leave some buffer room
        Graphics graphics = Graphics.FromImage(bitMap);
        Rectangle clientRect = new Rectangle(0, 0, bitMap.Width, bitMap.Height);
        Pen pen = new Pen(Color.Black);
        pen.Width = 2; // matches the client capture

        // draw the bit map
        if (x > 0 && y > 0)
            graphics.DrawImage(bitMap, x, y);
        else
            graphics.DrawImage(bitMap, 0, 0);
        graphics.FillRectangle(Brushes.White, clientRect);
        graphics.DrawRectangle(pen, clientRect);
        strokesCount = strokes.Count;
        for (int j = 0; j < strokesCount; j++)
        {
            Stroke stroke = (Stroke)strokes[j];
            if (stroke != null)
            {
                Point[] points = stroke.ToPointArray();
                int len = points.Length;
                if (len > 1)
                {
                    Point prevPoint = points[0];
                    for (int i = 1; i < len; i++)
                    {
                        graphics.DrawLine(pen, prevPoint.X, prevPoint.Y, points[i].X, points[i].Y);
                        prevPoint = points[i];
                    }
                }
            }
        }

        // create the bytes from the bitmap to be returned
        MemoryStream memStream = new MemoryStream(1000);
        ImageCodecInfo imageCodedInfo = GetEncoderInfo(encoderType);
        bitMap.Save(memStream, imageCodedInfo, null);
        byte[] bytes = memStream.GetBuffer();
        memStream.Close();
        return bytes;
    }

    private static ImageCodecInfo GetEncoderInfo(String mimeType)
    {
        int j;
        ImageCodecInfo[] encoders;
        encoders = ImageCodecInfo.GetImageEncoders();
        for (j = 0; j < encoders.Length; ++j)
        {
            if (encoders[j].MimeType == mimeType)
                return encoders[j];
        }
        return null;
    }

Hope this helps. NOTE: I have not looked into to optimizing the above code

希望这个有帮助。注意:我还没有考虑优化上面的代码