积极答复者
请问如何一张图片之后通过位移来切换不同的图片

问题
-
答案
-
@老板说这样做的好处是图片在内存中,不要加载卸载,人眼看不出效果
如果要在内存中,那么必须使用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); } }
- 已标记为答案 Steven.桦仔 2012年12月11日 3:59
-
dear
是丫,自己控制弹性比较大,相对的代码就会多(好维护),反之则代码少(不好维护),自己跟老板讨论衡量下。
你会发现很多软件在开启的时,通常会摆一个 loading 的 ui 在旋转,那是因为软件正在载入大量的资料(disk I/O),比如:图片/文挡,假若你不想等待开启时间,那就花时间写多线程;但你一开始就得载入一个必要的大挡,这就闪不掉了。
资料的载入优化个人觉得摆在后面再作,该完成的功能没完成,客户才不管你软件开的快或慢。
秘訣無它,唯勤而已 http://www.dotblogs.com.tw/yc421206/
- 已标记为答案 Steven.桦仔 2012年12月11日 3:59
全部回复
-
你好,如果是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 -
@老板说这样做的好处是图片在内存中,不要加载卸载,人眼看不出效果
如果要在内存中,那么必须使用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); } }
- 已标记为答案 Steven.桦仔 2012年12月11日 3:59
-
你好,如果是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 -
onpaint事件里用e.graphics.drawimage指定坐标
-
http://msdn.microsoft.com/zh-cn/library/ms142045.aspx
-
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/
-
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/
-
dear
是丫,自己控制弹性比较大,相对的代码就会多(好维护),反之则代码少(不好维护),自己跟老板讨论衡量下。
你会发现很多软件在开启的时,通常会摆一个 loading 的 ui 在旋转,那是因为软件正在载入大量的资料(disk I/O),比如:图片/文挡,假若你不想等待开启时间,那就花时间写多线程;但你一开始就得载入一个必要的大挡,这就闪不掉了。
资料的载入优化个人觉得摆在后面再作,该完成的功能没完成,客户才不管你软件开的快或慢。
秘訣無它,唯勤而已 http://www.dotblogs.com.tw/yc421206/
- 已标记为答案 Steven.桦仔 2012年12月11日 3:59
-
不是软件开启的时候把所有图片载入到内存,而是当你点击一个按钮的时候才把图片载入内存
而那张图片就包括了鼠标移入跟鼠标移出的效果两张图片放在一张图片里,美工没有帮你切好
像编程志愿者大侠所说,如果一张图片开一个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); } }