none
请问如何一张图片之后通过位移来切换不同的图片 RRS feed

  • 问题

  • 我现在的做法是 例如:按钮  使用mouseenter  和mouseleave两个事件来处理来加载不同的图片

    现在老板要求使用两张图片合起来一张,通过位移的方法来切换图片,请教各位大侠了

    我现在的写法  使用mouseenter  和mouseleave两个事件来加载这两张不同的图片:

      btn_StartMenu.Image = Image.FromFile(Application.StartupPath + @"\images\public\startbutton.png");

    老板说这样做的好处是图片在内存中,不要加载卸载,人眼看不出效果

    给我写信: QQ我:点击这里给我发消息

    2012年12月6日 3:37

答案

  • @老板说这样做的好处是图片在内存中,不要加载卸载,人眼看不出效果

    如果要在内存中,那么必须使用MemoryStream,先把两个图片读入到内存,然后绑定到Image中,代码如下 (请酌情根据自己情况修改):

    public partial class Form1 : Form
        {
            MemoryStream ms1 = null;
            MemoryStream ms2 = null;
     
            public Form1()
            {
                InitializeComponent();
                ms1 = new MemoryStream(File.ReadAllBytes("图片1绝对或者相对路径"));
                ms2 = new MemoryStream(File.ReadAllBytes("图片2绝对或者相对路径"));
            }
     
            private void mousemove_Click(object sender, EventArgs e)
            {
                PictureBox1.Image = Image.FromStream(ms1);
                
            }
            private void mousemout_Click(object sender, EventArgs e)
            {
                PictureBox1.Image = Image.FromStream(ms2);
     
            }
        }

    我的博客园
    慈善点击,点击此处
    和谐拯救危机,全集下载,净化人心

    2012年12月6日 5:22
    版主
  • dear

    是丫,自己控制弹性比较大,相对的代码就会多(好维护),反之则代码少(不好维护),自己跟老板讨论衡量下。

    你会发现很多软件在开启的时,通常会摆一个 loading 的 ui 在旋转,那是因为软件正在载入大量的资料(disk I/O),比如:图片/文挡,假若你不想等待开启时间,那就花时间写多线程;但你一开始就得载入一个必要的大挡,这就闪不掉了。

    资料的载入优化个人觉得摆在后面再作,该完成的功能没完成,客户才不管你软件开的快或慢。


    秘訣無它,唯勤而已 http://www.dotblogs.com.tw/yc421206/

    2012年12月11日 3:36

全部回复

  • 你好,如果是Web的話,改變它們的Z-index,便可以決定那一個在"上"面

    大家一齊探討、學習和研究,謝謝!
    MCSD, MCAD, MCSE+I, MCDBA, MCDST, MCSA, MCTS, MCITP, MCPD,
    MCT, Microsoft Community Star(TW & HK),
    Microsoft MVP for VB.NET since 2003
    My MSMVP Blog

    2012年12月6日 3:59
  • C# winform

    给我写信: QQ我:点击这里给我发消息

    2012年12月6日 4:39
  • @老板说这样做的好处是图片在内存中,不要加载卸载,人眼看不出效果

    如果要在内存中,那么必须使用MemoryStream,先把两个图片读入到内存,然后绑定到Image中,代码如下 (请酌情根据自己情况修改):

    public partial class Form1 : Form
        {
            MemoryStream ms1 = null;
            MemoryStream ms2 = null;
     
            public Form1()
            {
                InitializeComponent();
                ms1 = new MemoryStream(File.ReadAllBytes("图片1绝对或者相对路径"));
                ms2 = new MemoryStream(File.ReadAllBytes("图片2绝对或者相对路径"));
            }
     
            private void mousemove_Click(object sender, EventArgs e)
            {
                PictureBox1.Image = Image.FromStream(ms1);
                
            }
            private void mousemout_Click(object sender, EventArgs e)
            {
                PictureBox1.Image = Image.FromStream(ms2);
     
            }
        }

    我的博客园
    慈善点击,点击此处
    和谐拯救危机,全集下载,净化人心

    2012年12月6日 5:22
    版主
  • 通过位移不行吗?我怕美工不给我切割好的图片


    给我写信: QQ我:点击这里给我发消息

    2012年12月6日 6:15
  • 你好,如果是Winform的話,你可以這樣

    如果想PictureBox1在上面,可以用
    PictureBox1.BringToFront();


    如果想PictureBox2在上面,可以用
    PictureBox2.BringToFront();


    大家一齊探討、學習和研究,謝謝!
    MCSD, MCAD, MCSE+I, MCDBA, MCDST, MCSA, MCTS, MCITP, MCPD,
    MCT, Microsoft Community Star(TW & HK),
    Microsoft MVP for VB.NET since 2003
    My MSMVP Blog

    2012年12月6日 7:07
  • 你回答的跟我的问题好像没有什么关系 kenlin大侠


    给我写信: QQ我:点击这里给我发消息

    2012年12月6日 8:28
  • onpaint事件里用e.graphics.drawimage指定坐标

    http://feiyun0112.cnblogs.com/

    2012年12月6日 11:44
    版主
  • 可以给个例子吗?


    给我写信: QQ我:点击这里给我发消息

    2012年12月6日 11:54
  • @现在老板要求使用两张图片合起来一张,通过位移的方法来切换图片

    没有理解你老板的意思?可以截图说明清楚吗?


    我的博客园
    慈善点击,点击此处
    和谐拯救危机,全集下载,净化人心

    2012年12月7日 8:44
    版主
  • 就是下面的两张图片是在同一张图片里面,美工不给我切图,只能依靠移动图片的方式来切换

    这两张图片,就是当我鼠标移上去的时候用代码控制把图片移动到第二部分

    当我鼠标离开的时候把图片移动到第一部分

    比如图片的大小是80*30,那么第一部分的像素是0~40(我指的是宽度),第二步的像素是41~80

    如果还不能理解的话无办法了


    给我写信: QQ我:点击这里给我发消息


    2012年12月7日 11:09
  • http://msdn.microsoft.com/zh-cn/library/ms142045.aspx

    http://feiyun0112.cnblogs.com/

    2012年12月7日 14:24
    版主
  • dear

    让我理解下,你是说有,只有一张图,分别提供三个功能(或是更多)按钮??

    若是的话,这是一个很怪且不切实际的需求,假设图形大小变了,荧幕解析度变了,您的代码不就又得改了,试想一个专案里若有一堆图,你的人生就陷入在offset里了,另外三张图变成一张图并不会改变太大的除存空间;再者,美工那边必须不能乱动尺寸,一动你就不用睡了,建议您:

    1.请跟老板陈述问题,分析利弊,将不同功能的图切成不同的图,可以的话,可在依照解析度画出不同尺寸的图,比如:64x64, 128x128

    2.使用 Image Optimizer,来压缩你专案内的图,这有很高压缩比且不失真的功能

    你的问题是可以达成的,所有的挡案都可以利用byte[]来处理,请参考以下使用memoryStream ReadByte

    http://www.dotblogs.com.tw/yc421206/archive/2009/11/01/11370.aspx


    秘訣無它,唯勤而已 http://www.dotblogs.com.tw/yc421206/

    2012年12月8日 16:49
  • 比如 我有一个按钮,按钮大小是40*30,那么美工给一张图片 80*30,我通过位移来切换图片

    鼠标移上去的时候移动图片到x坐标 到41这个像素,鼠标离开按钮的时候鼠标又回到x坐标0这个像素


    给我写信: QQ我:点击这里给我发消息

    2012年12月9日 1:07
  • dear

    自己切圖可否?
    http://stackoverflow.com/questions/4118150/image-splitting-into-9-pieces


    秘訣無它,唯勤而已 http://www.dotblogs.com.tw/yc421206/

    2012年12月9日 5:14
  • 太复杂了,程序里有很多按钮的话,如果这样切,太复杂了,有些按钮的尺寸有不一定相同

    搞死人了


    给我写信: QQ我:点击这里给我发消息

    2012年12月9日 7:46
  • dear

    个人认为,本来就应该要把图切好,然后摆到按钮里,一开始我就说了,这会很费工,你光是调整 offset 就可以不用睡了。

    图看要怎样切,叫美工用 photo shop 切,还自己是用 code 切,这两者是不同的职责;如果我自己没有美工,我也会将图处理好再把它弄到专案里

    我是没看过 icon 都是在同一个挡案里的,试着想想这种图挡该如何重用,我个人的做法会将 icon 依照功能分类好。


    秘訣無它,唯勤而已 http://www.dotblogs.com.tw/yc421206/

    2012年12月9日 17:28
  • 是啊,看了你们给出的代码很复杂,是老板要求把图片载入内存,让客户看不出切换图片的时间差

    哎~


    给我写信: QQ我:点击这里给我发消息

    2012年12月10日 2:19
  • dear

    载入内存跟切图是两码事吧,切图的动作本就复杂

    你可以:

    1.把图挡摆到专案的resource里。

    2.把图挡存放到Stream里。

    这动作根本不需要处理切图,再者,图形的呈现还得靠硬体显卡来支撑,并非所有的机器都能如你所愿,


    秘訣無它,唯勤而已 http://www.dotblogs.com.tw/yc421206/

    2012年12月10日 3:09
  • 图片太多,放在resource里不实际,而且有可能要经常更换图片

    你说放在stream里,是跟编程志愿者大侠说的一开始载入到MemoryStream里吗?


    给我写信: QQ我:点击这里给我发消息

    2012年12月10日 11:06
  • dear

    1.放在专案里的 resoure 也是内存啊,直接就载入了 =.= ,哪里不实际?换图也不用换挡名,也不会动到代码。

    2.MemoryStream 是继承 Stream,
    http://msdn.microsoft.com/zh-cn/library/system.io.memorystream%28v=vs.80%29.aspx

    你要用啥 Stream 都可以,例如:BufferedStream、FileStream,再把 Stream 摆到 Bitmap/Image class,就可以给控件用了。http://stackoverflow.com/questions/7413184/converting-a-jpeg-image-to-a-byte-array-com-exception

    3.不论如何挡案只要 ,不论大小,都要花很长的时间,不信你可以自己试试,有 1000 个挡案共 100MB 与单一挡案100 MB copy 的速度。这两种方法差异在 弹性,resoure 没办法弹性的控制图片载入的顺序,且只有主线程在处理,用Stream可以决定哪几张图得先载入,其余的图再用其他线程分批载入。


    秘訣無它,唯勤而已 http://www.dotblogs.com.tw/yc421206/

    2012年12月10日 15:33
  • 你的意思是说使用Stream比较好是吧?虽然resource跟stream都是一次过把图片载入内存

    但是stream可以使用多线程把图片一次载入是吧?


    给我写信: QQ我:点击这里给我发消息

    2012年12月11日 2:20
  • dear

    是丫,自己控制弹性比较大,相对的代码就会多(好维护),反之则代码少(不好维护),自己跟老板讨论衡量下。

    你会发现很多软件在开启的时,通常会摆一个 loading 的 ui 在旋转,那是因为软件正在载入大量的资料(disk I/O),比如:图片/文挡,假若你不想等待开启时间,那就花时间写多线程;但你一开始就得载入一个必要的大挡,这就闪不掉了。

    资料的载入优化个人觉得摆在后面再作,该完成的功能没完成,客户才不管你软件开的快或慢。


    秘訣無它,唯勤而已 http://www.dotblogs.com.tw/yc421206/

    2012年12月11日 3:36
  • 不是软件开启的时候把所有图片载入到内存,而是当你点击一个按钮的时候才把图片载入内存

    而那张图片就包括了鼠标移入跟鼠标移出的效果两张图片放在一张图片里,美工没有帮你切好

    像编程志愿者大侠所说,如果一张图片开一个MemoryStream ,不知道好不好维护,先标记答案了

    public partial class Form1 : Form
        {
            MemoryStream ms1 = null;
            MemoryStream ms2 = null;
     
            public Form1()
            {
                InitializeComponent();
                ms1 = new MemoryStream(File.ReadAllBytes("图片1绝对或者相对路径"));
                ms2 = new MemoryStream(File.ReadAllBytes("图片2绝对或者相对路径"));
            }
     
            private void mousemove_Click(object sender, EventArgs e)
            {
                PictureBox1.Image = Image.FromStream(ms1);
                
            }
            private void mousemout_Click(object sender, EventArgs e)
            {
                PictureBox1.Image = Image.FromStream(ms2);
     
            }
        }


    给我写信: QQ我:点击这里给我发消息

    2012年12月11日 3:59