WPF用流的方式上传/显示/下载图片文件(保存在数据库)

1.xaml

<Window x:Class="WpfUploadDispalyIMG.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="MainWindow" Height="300" Width="800">
    <Grid>
        <TextBox Height="23" HorizontalAlignment="Left" Margin="14,12,0,0" Name="FileNameTextBox" VerticalAlignment="Top" Width="394" IsEnabled="False" />
        <Button Content="浏览" Height="23" HorizontalAlignment="Left" Margin="414,12,0,0" Name="btBrowse" VerticalAlignment="Top" Width="49" Click="btBrowse_Click" />
        <Button Content="上传" Height="23" HorizontalAlignment="Left" Margin="469,12,0,0" Name="btUpdate" VerticalAlignment="Top" Width="49" Click="btUpdate_Click" />
        <Image   Margin="12,41,0,0" Name="image1" Stretch="Fill"  Width="200" Height="200" />
        <TextBox Height="23" HorizontalAlignment="Left" Margin="590,13,0,0" Name="tbName" VerticalAlignment="Top" Width="46" />
        <TextBlock Height="23" HorizontalAlignment="Left" Margin="529,16,0,0" Name="textBlock1" Text="输入姓名:" VerticalAlignment="Top" />
        <Button Content="查看照片" Height="23" HorizontalAlignment="Left" Margin="642,13,0,0" Name="btShow" VerticalAlignment="Top" Width="65" Click="btShow_Click" />
        <Button Content="保存" Height="23" HorizontalAlignment="Left" Margin="708,13,0,0" Name="btSave" VerticalAlignment="Top" Width="65" Click="btSave_Click" />
    </Grid>
</Window>

2.cs

using System;
using System.Linq;
using System.Windows;
using System.Windows.Media.Imaging;
using System.IO;
using System.Data.Linq;

namespace WpfUploadDispalyIMG
{

    public partial class MainWindow : Window
    {
        DataClasses1DataContext db = new DataClasses1DataContext();
        public MainWindow()
        {
            InitializeComponent();
        }    
        //添加图片并浏览
        private void btBrowse_Click(object sender, RoutedEventArgs e)
        {
            //创建"打开文件"对话框
            Microsoft.Win32.OpenFileDialog dlg = new Microsoft.Win32.OpenFileDialog();

            //设置文件类型过滤
            dlg.Filter = "图片|*.jpg;*.png;*.gif;*.bmp;*.jpeg";

            // 调用ShowDialog方法显示"打开文件"对话框
            Nullable<bool> result = dlg.ShowDialog();

            if (result == true)
            {
                //获取所选文件名并在FileNameTextBox中显示完整路径
                string filename = dlg.FileName;
                FileNameTextBox.Text = filename;

                //在image1中预览所选图片
                BitmapImage image = new BitmapImage(new Uri(filename));
                image1.Source = image;
                image1.Width = image.Width;
                image1.Height = image.Height;
            }
        }

        //上传图片至数据库
        private void btUpdate_Click(object sender, RoutedEventArgs e)
        {
            if (!string.IsNullOrEmpty(FileNameTextBox.Text))
            {
                 UploadIMG();
                MessageBox.Show("OK!");
                FileNameTextBox.Text = string.Empty;

            }
            else
                MessageBox.Show("请选择图片!");
        }
        private void UploadIMG()
        {
            //将所选文件的读入字节数组img
            byte[] img = File.ReadAllBytes(FileNameTextBox.Text);
            string fileName = System.IO.Path.GetFileNameWithoutExtension(FileNameTextBox.Text);
                //FileNameTextBox.Text.Substring(FileNameTextBox.Text.LastIndexOf('\\')+1);
            Crew newCrew = new Crew()
            {
                //[key]=[value]
                photo = img,//将图片写入数据库
                name = fileName
            };
            db.Crew.InsertOnSubmit(newCrew);
            db.SubmitChanges();
        }


        //显示图片
        private void btShow_Click(object sender, RoutedEventArgs e)
        {
            try
            {
                //根据文件名读取二进制形式的图片
                Binary p = db.Crew.FirstOrDefault(c => c.name == tbName.Text.Trim()).photo;
                byte[] img = p.ToArray();
                ShowSelectedIMG(img);
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
            }
        }
        private void ShowSelectedIMG(byte[] img)
        {
            BitmapImage image = new BitmapImage();
            //以流的形式初始化图片
            image.BeginInit();
            image.StreamSource = new MemoryStream(img);
            image.EndInit();

            image1.Source = image;
            image1.Width = image.PixelWidth;
            image1.Height = image.PixelHeight;
        }


        //保存为文件
        private void btSave_Click(object sender, RoutedEventArgs e)
        {
            //创建"保存文件"对话框

            Microsoft.Win32.SaveFileDialog dlg = new Microsoft.Win32.SaveFileDialog();
            //设置默认文件类型
            dlg.DefaultExt = ".png";
            Nullable<bool> result = dlg.ShowDialog();

            if (result == true)
            {
                //获取要保存文件名的完整路径
                string filename = dlg.FileName;
                //将文件流写入文件
                FileStream write = new FileStream(filename, FileMode.OpenOrCreate, FileAccess.ReadWrite, System.IO.FileShare.Read);
                Binary p = db.Crew.FirstOrDefault(c => c.name == tbName.Text.Trim()).photo;
                byte[] img = p.ToArray();
                write.Write(img, 0, img.Count());
               write.Close();
               MessageBox.Show("成功保存");
            }
        }
    }
}

文章转自:http://www.cnblogs.com/Laro/archive/2011/05/23/2054009.html

  • 2
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
1.项目代码均经过功能验证ok,确保稳定可靠运行。欢迎下载体验!下载完使用问题请私信沟通。 2.主要针对各个计算机相关专业,包括计算机科学、信息安全、数据科学与大数据技术、人工智能、通信、物联网等领域的在校学生、专业教师、企业员工。 3.项目具有丰富的拓展空间,不仅可作为入门进阶,也可直接作为毕设、课程设计、大作业、初期项目立项演示等用途。 4.当然也鼓励大家基于此进行二次开发。在使用过程中,如有问题或建议,请及时沟通。 5.期待你能在项目中找到乐趣和灵感,也欢迎你的分享和反馈! 【资源说明】 基于C#开发的一款即时通讯软件源码(含客户端+服务端+使用说明).zip 一款参考QQ、微信的即时通讯软件。采用CS结构,客户端基于.Net与WPF开发,服务端使用Java开发。 环境准备 1. 数据库准备:需要先运行MySQL脚本,进行数据库表的创建 2. 服务器准备:修改Server项目中的application.xaml文件,配置OAuth2授权平台的相关信息以及项目的端口等信息后启动服务端。(其中第三方授权依赖引入自我的阿里云私服,Maven无法直接下载,可前往我的Github:[openauth-spring-boot-starter](https://github.com/Ken-Chy129/openauth-spring-boot-starter)进行下载) 3. 客户端准备:进入App.xaml.cs文件配置服务端的IP地址,同时在HttpUtil工具类中接入AI机器人接口、短信验证服务接口等,正确地配置SocketUtil中的连接。 运行说明 1. 打开软件后首先进入登录界面,如果已经完成注册,则通过输入手机号码和密码进行登录,也可以使用QQ进行授权登录。如果未注册则可以点击注册账号按钮进入注册界面。 2. 进入注册界面后,点击头像框的从本地选择图片作为头像,紧接着填写用户名、密码以及手机号码,用户名和密码会有长度的限制,而手机号码会进行合法性的校验。手机号码合法的情况下,点击获取验证码按钮之后,对应的手机号就可以收到验证短信。接着填写验证码之后就可以点击注册按钮完成注册。 3. 注册成功之后会自动跳转到登录界面,接着输入注册的手机号码和密码之后点击登录(或键入回车键)就可以进入主界面。用户在注册后系统会自动添加一个名为 Robot的AI好友,可以通过在消息框输入内容后点击发送按钮或键入回车键发送消息与其进行对话。 4. 用户也可以点击添加按钮进入添加好友界面,通过输入用户名搜索其他用户(支持模糊查询)。 5. 用户可以点击查询结果项进入用户的个人资料界面查看用户相关信息。 6. 如果想要添加用户则通过点击+号按钮,进入好友请求界面。在该界面可以通过点击用户名后的铅笔按钮为用户设置备注名,同时填写验证消息,最后通过点击发送请求按钮来发送好友请求。 7. 另一个用户可以通过点击好友请求按钮进入好友请求列表界面,查看发送给自己的添加好友请求。可以通过点击√按钮来接受请求,也可以通过点击×按钮来拒绝请求。之后同样可以通过点击用户名后面的铅笔按钮为好友设置备注名。 8. 接受请求之后双方便成为好友关系,并且可以在各自的好友列表中看到对方的存在。好友列表会有一个带颜色的圆圈表示用户状态,绿色表示用户在线,灰色表示用户离线。用户可以点击好友来进入与其的会话框,之后即可以与好友进行通讯。用户还可以点击群聊按钮进去群聊列表,之后同样可以选择一个群聊进行通讯。 9. 用户可以通过列表上访的搜索框进行搜索,如果当前是在好友列表则搜索显示匹配的好友;如果当前切换到了群组列表,则搜索显示出匹配的群组。 10. 用户还可以通过点击上方的房子形状的按钮进入个人主页。在该界面中用户可以通过点击铅笔按钮进入修改模式,点击之后用户可以上传头像,修改用户名、个性签名、性别、邮箱号、所在地区等信息,对于账号,手机号码和注册时间等信息则无法进行修改。修改完成之后点击Save则完成保存并且同步渲染到主界面,如果点击Cancel则会将所有信息重置到修改以前。 11. 用户通过右键指定的好友可以唤起一个菜单,其中可以选择显示好友资料或者删除好友。如果点击删除好友则会弹出提示框询问是否确认操作,在确认删除之后则会解除双方的好友消息,同时将双方从对方的好友列表中移除,此外被删除方还会收到被对方删除的提示消息。 12. 当用户进入主界面之后,点击界面右上方的x按钮并不会退出软件,而只是最小化到系统托盘。如果用户想真正退出程序,应该通过右键系统托盘选择退出项进行退出。
好的,让我来回答你的问题。 对于第一个问题,可以使用MVVM的DataTriggers来实现WPF XAML视图之间的切换。具体来说,可以在ViewModel中定义一个属性,用来表示当前要显示的视图,然后在XAML中使用DataTriggers来根据该属性的值来切换视图。以下是一个示例代码: ```xml <Window> <Window.Resources> <DataTemplate x:Key="View1Template"> <!-- View1的内容 --> </DataTemplate> <DataTemplate x:Key="View2Template"> <!-- View2的内容 --> </DataTemplate> </Window.Resources> <ContentControl Content="{Binding CurrentView}"> <ContentControl.Style> <Style TargetType="ContentControl"> <Setter Property="ContentTemplate" Value="{StaticResource View1Template}" /> <Style.Triggers> <DataTrigger Binding="{Binding CurrentView}" Value="View2"> <Setter Property="ContentTemplate" Value="{StaticResource View2Template}" /> </DataTrigger> </Style.Triggers> </Style> </ContentControl.Style> </ContentControl> </Window> ``` 对于第二个问题,可以使用WPF的布局系统来实现Window窗口自适应内容大小并居中。具体来说,可以将控件放在一个Grid中,然后将该Grid的HorizontalAlignment和VerticalAlignment属性都设置为Center,这样就可以实现窗口自适应内容大小并居中。以下是一个示例代码: ```xml <Window> <Grid HorizontalAlignment="Center" VerticalAlignment="Center"> <!-- 控件内容 --> </Grid> </Window> ``` 希望这些回答对你有帮助。如果你有任何其他问题,请随时问我。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值