在 PostgreSQL 中,解决图片二进制数据,由于bytea_output参数问题导致显示不正常的问题。

这篇具有很好参考价值的文章主要介绍了在 PostgreSQL 中,解决图片二进制数据,由于bytea_output参数问题导致显示不正常的问题。。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

在 PostgreSQL 中,bytea_output 参数控制在查询结果中 bytea 类型的显示格式。默认情况下,bytea_output 的值为 hex,这意味着在查询结果中,bytea 类型的数据以十六进制格式显示。但是,如果你的应用程序期望以二进制格式获取图像数据,则将 bytea_output 设置为 escape 可能更适合。无论 bytea_output 参数设置为 hex 还是 escape,你都可以通过 C# 访问 PostgreSQL 数据库,并且正常获取并显示图片。本篇随笔介绍这个问题的处理过程。

1、碰到的数据库图片在界面显示问题

在我们的Winform框架中,由于底层是支持多种数据库的设计,因此可以兼容MS SQLServer、Oracle、Mysql、PostgreSQL、SQLite等数据库的,但是一般我们用的是SQLServer、MySql居多,有客户切换到PostgreSQL数据库的时候,发现图片显示不正常,需要对图片进行十六进制转换才能正常显示。

在 PostgreSQL 中,解决图片二进制数据,由于bytea_output参数问题导致显示不正常的问题。

在 PostgreSQL 中,解决图片二进制数据,由于bytea_output参数问题导致显示不正常的问题。

 默认的方式,这里方框在SQLServer等数据库上是正常显示图标的,打开编辑也是可以展示菜单的图表的,不过由于切换到PostgreSQL后,这里图标消失,检查数据库操作,默认的处理都是一致的,因此考虑是否为数据库参数配置问题。

2、解决问题

打开ChatGPT,或者百度、Google一下,细心都可以发现,在 PostgreSQL 中默认情况下,bytea_output 的值为 hex,这意味着在查询结果中,bytea 类型的数据以十六进制格式显示。如果你的应用程序期望以二进制格式获取图像数据,则将 bytea_output 设置为 escape 可能更适合。

我们找到PostgreSQL的安装目录,找到 C:\Program Files\PostgreSQL\13\data\postgresql.conf里面的数据库配置文件,找到bytea_output 的值查看。

在 PostgreSQL 中,解决图片二进制数据,由于bytea_output参数问题导致显示不正常的问题。

果然发现其默认值为hex,我们按要求修改为 escape,并去掉注释符号#,如下所示。

在 PostgreSQL 中,解决图片二进制数据,由于bytea_output参数问题导致显示不正常的问题。

 重启PostgreSQL,并测试系统数据库,显示和保存处理正常。

在 PostgreSQL 中,解决图片二进制数据,由于bytea_output参数问题导致显示不正常的问题。

3、两种方式处理的差异

 如果 bytea_output 参数设置为 hex,你可以通过将读取到的十六进制字符串转换为字节数组,然后使用这些字节数组来创建图像对象。以下是一个示例代码,演示了如何在 C# 中获取并显示图片,即使 bytea_output 参数设置为 hex

class Program
{
    static void Main()
    {
        string connString = "Host=myServerAddress;Port=myPort;Username=myUsername;Password=myPassword;Database=myDatabase";

        using (var conn = new NpgsqlConnection(connString))
        {
            conn.Open();

            // 执行 SQL 查询以获取图像数据
            string sql = "SELECT image_column FROM your_table WHERE id = @id";
            int id = 1; // 替换为你要查询的图像的 ID
            using (var cmd = new NpgsqlCommand(sql, conn))
            {
                cmd.Parameters.AddWithValue("@id", id);

                // 读取图像数据
                using (var reader = cmd.ExecuteReader(CommandBehavior.SequentialAccess))
                {
                    if (reader.Read())
                    {
                        // 获取十六进制字符串
                        string hexString = reader.GetString(0);

                        // 将十六进制字符串转换为字节数组
                        byte[] imageData = StringToByteArray(hexString);

                        // 创建图像对象
                        using (MemoryStream ms = new MemoryStream(imageData))
                        {
                            Image image = Image.FromStream(ms);

                            // 显示图像
                            ShowImage(image);
                        }
                    }
                }
            }
        }
    }

    static void ShowImage(Image image)
    {
        // 创建一个新的窗体
        using (var form = new System.Windows.Forms.Form())
        {
            // 创建 PictureBox 控件
            var pictureBox = new System.Windows.Forms.PictureBox();
            pictureBox.Dock = System.Windows.Forms.DockStyle.Fill;
            pictureBox.Image = image;

            // 将 PictureBox 添加到窗体中
            form.Controls.Add(pictureBox);

            // 设置窗体大小并显示
            form.Size = new System.Drawing.Size(image.Width, image.Height);
            form.ShowDialog();
        }
    }

    static byte[] StringToByteArray(string hex)
    {
        int NumberChars = hex.Length / 2;
        byte[] bytes = new byte[NumberChars];
        using (var sr = new StringReader(hex))
        {
            for (int i = 0; i < NumberChars; i++)
                bytes[i] = Convert.ToByte(new string(new char[2] { (char)sr.Read(), (char)sr.Read() }), 16);
        }
        return bytes;
    }
}

如果 bytea_output 参数设置为 escape,则可以直接使用 Npgsql 从数据库中读取图像数据,并将其转换为字节数组,而不需要进行额外的处理。以下是示例代码:

using Npgsql;
using System;
using System.Data;
using System.Drawing;
using System.IO;

class Program
{
    static void Main()
    {
        string connString = "Host=myServerAddress;Port=myPort;Username=myUsername;Password=myPassword;Database=myDatabase";

        using (var conn = new NpgsqlConnection(connString))
        {
            conn.Open();

            // 执行 SQL 查询以获取图像数据
            string sql = "SELECT image_column FROM your_table WHERE id = @id";
            int id = 1; // 替换为你要查询的图像的 ID
            using (var cmd = new NpgsqlCommand(sql, conn))
            {
                cmd.Parameters.AddWithValue("@id", id);

                // 读取图像数据
                using (var reader = cmd.ExecuteReader(CommandBehavior.SequentialAccess))
                {
                    if (reader.Read())
                    {
                        // 获取图像数据字节数组
                        byte[] imageData = (byte[])reader["image_column"];

                        // 创建图像对象
                        using (MemoryStream ms = new MemoryStream(imageData))
                        {
                            Image image = Image.FromStream(ms);

                            // 显示图像
                            ShowImage(image);
                        }
                    }
                }
            }
        }
    }

    static void ShowImage(Image image)
    {
        // 创建一个新的窗体
        using (var form = new System.Windows.Forms.Form())
        {
            // 创建 PictureBox 控件
            var pictureBox = new System.Windows.Forms.PictureBox();
            pictureBox.Dock = System.Windows.Forms.DockStyle.Fill;
            pictureBox.Image = image;

            // 将 PictureBox 添加到窗体中
            form.Controls.Add(pictureBox);

            // 设置窗体大小并显示
            form.Size = new System.Drawing.Size(image.Width, image.Height);
            form.ShowDialog();
        }
    }
}

无论 bytea_output 参数设置为 hex 还是 escape,你都可以通过 C# 访问 PostgreSQL 数据库,并且正常获取并显示图片。

 文章来源地址https://www.toymoban.com/news/detail-842314.html

到了这里,关于在 PostgreSQL 中,解决图片二进制数据,由于bytea_output参数问题导致显示不正常的问题。的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 在PostgreSQL中如何处理大对象(Large Objects),例如存储和检索二进制文件?

    PostgreSQL 提供了对大对象(Large Objects)的支持,这是一种特殊的数据类型,用于存储大量数据,通常用于存储二进制文件或大型文本数据。大对象存储在数据库外部,但在数据库内部进行管理,从而允许您像处理普通数据库对象一样处理它们。 以下是在 PostgreSQL 中处理大对象

    2024年04月27日
    浏览(74)
  • 微信小程序获取后台返回的二进制图片

    获取后台返回的二进制图片需要先使用wx.request方法发起网络请求获取图片数据,然后将返回的数据用wx.arrayBufferToBase64方法进行转换,最后将转换后的数据绑定到图片的src属性即可。 参考代码如下 其中,url为后台返回的图片地址,responseType为返回的数据类型为二进制数组。在

    2024年02月10日
    浏览(64)
  • Java 中图片与二进制之间如何相互转换?

    1、 下面是一个完整的代码示例。 指定文件路径转为二进制 将网络图片转为二进制 base64 转为图片资源 2、如何判断 base64 图片的格式? 3、将网络图片转为 base64 字符串 4、将 base64 字符串转为图片输出 注:该方法的入参,base64 格式文件不得有 文件头部标识信息,否则会转换

    2024年02月10日
    浏览(48)
  • Vue 读取后台二进制文件流转为图片显示

    Vue 读取后台二进制文件流转为图片显示 后台返回格式 axios写法 重点 responseType: ‘blob’ , 使用的是res中的data blob 本文章参考 https://huaweicloud.csdn.net/63a56170b878a545459459f2.html

    2024年04月11日
    浏览(41)
  • Vue前端渲染blob二进制对象图片的方法

    近期做开发,联调接口。接口返回的是一张图片,是对二进制图片处理并渲染,特此记录一下。 本文章是转载文章,原文章:Vue前端处理blob二进制对象图片的方法 接口response是下图 显然,获取到的是一堆乱码,前端需要将其解析出来,百度之后发现解析二进制文档流的写法

    2024年02月15日
    浏览(64)
  • Vue前端处理blob二进制对象图片的方法

    近期在做开发的时候遇到一个问题,前端传递一个参数,后端返回一张图片,前端再将该图片展示出来,由于是第一次处理二进制图片对象,特此记录一下。 首先,已知后端接口无误,传递参数可以正常返回图片    前端调用接口,打印并查看获取到的响应数据:     显然

    2024年02月16日
    浏览(51)
  • uniapp 上传本地图片、以二进制流的方式上传

    1、上传本地图片  1.1 uni.chooseImage uni.chooseImage(OBJECT) 从本地相册选择图片或使用相机拍照。 1.2 uni.uploadFile uni.uploadFile(OBJECT) 将本地资源上传到开发者服务器,客户端发起一个  POST  请求,其中  content-type  为  multipart/form-data 。 如页面通过 uni.chooseImage 等接口获取到一个

    2024年02月12日
    浏览(39)
  • 微信小程序接收二进制流文件(图片预览,文件打开)

     下面通过downloadOaFile接口获取到二进制流,即res.data 注意!!!直接用downloadOaFile获取的二进制流文件在写入时会导致文件损坏,必须在uni.request对象的属性中加上 如果不加,默认是 这一点非常重要,踩了好久的坑,而且这两点的区别在network的response中还看不出来,因为两者

    2024年02月16日
    浏览(58)
  • 【前端】WebSocket接收二进制数据转JSON并解决中文乱码问题(ArrayBuffer转json)

    WebSocket与mqtt服务器通信,接收二进制数据并将其转为Json使用。一般方式都会出现中文乱码问题。

    2024年01月22日
    浏览(66)
  • 前端:JS:将图片转为二进制与其他文本传入后端

    在前端,可以将图片转换为二进制数据,并将其与其他文本字符串一起发送到后端。一种常见的方法是将所有数据组合为一个 FormData 对象,然后通过 AJAX 或 Fetch API 将其发送给后端。以下是一个示例: 解释 : 当文件输入框内容发生变化时,会触发 change 事件。然后,它会读

    2024年04月26日
    浏览(41)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包