• .NET中如何得到图片大小


    随着最近TWaver .NET的正式发布,有不少使用过TWaver的Java,Web或Flex的老客户也可以尝试在项目中使用TWaver .NET,虽然TWaver .NET既有TWaver.Wpf.dll又有TWaver.Silverlight.dll两个开发包,同时支持WPF和Silverlight两种方式,用户可以根据自己需要任意挑选,不过根据我们最近走访全国各地目前使用TWaver .NET的仅二十家客户统计,采用Silverlight的解决方案比例还是居多,虽然WPF功能更加强大,但毕竟Silverlight通过很轻量的6m多插件就可以跑在windows,mac甚至是 symbianwindows phone 7 的mobile领域,发布如此轻量,更新如此轻松,部署如此广泛,何乐而不为呢。

    扯远了,回到今天主题,不少用过TWaver其他版本的老客户常抱怨,TWaver其他版本总是那么如此让人省心,让我们体验到开发GUI真的也能做到Don’t Repeat Yourself (DRY) ,为什么TWaver .NET上注册图片需要我提供width和height信息TWaver.Utils.RegisterImageByImageSource(string name, ImageSource imageSource, double width, double height)呢,这问题要怪应该怪微软,为什么Silverlight上非得将Image绑定上source并且真是display出来后才能真的得到width和height信息,当组件还没呈现时你去获取image的宽高只能得到0。

    在此我替微软向去年当TWaver .NET还在beta中就已经开始在项目中预言和使用客户道歉,我们没有彻底做到DRY,不过始终坚持最大程序减少用户工作量原则的TWaver开发团队,在正式TWaver .NET 1.0发布时提供了让人更舒心的RegisterPNGImage(string name, Uri uri)函数,是的,你不用在告诉TWaver宽高了,TWaver会自动的去获取,至于如何获取很多同学很感兴趣,以下实现代码原理很简单我就不解释了,总之条条道路通罗马,Silverlight不提供的我们也能走出自己的路

            internal static void RegisterPNGImage(string name, Uri uri)
            {
                StreamResourceInfo resourceInfo = Application.GetResourceStream(uri);
                if (resourceInfo != null && resourceInfo.Stream != null)
                {
                    BitmapImage image = new BitmapImage();
    #if SILVERLIGHT
                    image.SetSource(resourceInfo.Stream);
    #else
                    image.BeginInit();
                    image.StreamSource = resourceInfo.Stream;
                    image.EndInit();
    #endif
                    resourceInfo.Stream.Position = 0;
                    byte[] header = new byte[8];
                    resourceInfo.Stream.Read(header, 0, header.Length);
                    if (header[0] == 0x89 &&
                        header[1] == 0x50 && // P
                        header[2] == 0x4E && // N
                        header[3] == 0x47 && // G
                        header[4] == 0x0D && // CR
                        header[5] == 0x0A && // LF
                        header[6] == 0x1A && // EOF
                        header[7] == 0x0A)   // LF
                    {
                        byte[] buffer = new byte[16];
                        resourceInfo.Stream.Read(buffer, 0, buffer.Length);
                        Array.Reverse(buffer, 8, 4);
                        Array.Reverse(buffer, 12, 4);
    
                        double width = BitConverter.ToInt32(buffer, 8);
                        double height = BitConverter.ToInt32(buffer, 12);
    
                        resourceInfo.Stream.Close();
                        ImageUtils.RegisterImageAsset(name, new ImageAsset(image, width, height));
    
                        return;
                    }
                    resourceInfo.Stream.Close();
                }
                new Exception("Can not load PNG Image '" + name + "' URI: " + uri);
            }
    
  • 相关阅读:
    运行.bat批处理,CMD窗口隐藏,并制作为EXE文件
    TinyXML:一个优秀的C++ XML解析器(转载)
    2013编程之美资格赛【传话游戏】
    linux GTK教程(消息机制/标签/按钮/图像/文本/对话框/菜单/容器)
    c++强制类型转换(总结)
    string与char*的转换(转载)
    网络数据包捕获函数库Libpcap安装与使用(非常强大)
    Linux 高级Socket编程
    linux GTK 安装
    .dll和.lib文件的生成和使用 c++
  • 原文地址:https://www.cnblogs.com/twaver/p/2118393.html
Copyright © 2020-2023  润新知