C# image转换byte后,再转换回image保存到*.bmp文件深度被改变了 150

我这里有一张8位深度的图片,如果将它转换成btye后存入到数据库再读取出来类型为byte。publicImageBytesToImage(byte[]bytes){Mem... 我这里有一张 8 位深度的图片,如果将它转换成btye后存入到数据库再读取出来类型为byte。

public Image BytesToImage(byte[] bytes)
{

MemoryStream ms = new MemoryStream(bytes);
Image img = Image.FromStream(ms);
return img;
}
我使用这个方法将图片再次转换回image,这里我尝试用 image.save("测试.bmp");。
导出来后发现图片的深位度被修改了,而且图片的大小也被修改了。
原本图片的大小是74KB大,导出变成了361kb。深位度也变成了 32 位。

求解 各位大神。
展开
 我来答
然后去远足
2014-10-30 · TA获得超过1万个赞
知道大有可为答主
回答量:4016
采纳率:83%
帮助的人:2404万
展开全部
Image 类有个 PixelFormat 属性可以指定位深度,如果不指定,默认就是 32 位的,应该设置为 System.Drawing.Imaging.PixelFormat.Format8bppIndexed 值。

但这个属性是只读的,只能在实例化时指定。

建议先实例化一个 Bitmap(Bitmap 类是继承自 Image 类的),有一种构造方法是 Bitmap(int, int System.Drawing.Imaging.PixelFormat)。然后将你的图片先绘制到新的 Bitmap 对象上,再保存。

不过据说 Image.Save() 方法有个 Bug,具体分析和解决方案参考:http://bbs.csdn.net/topics/330223763
追问

但是从旧图贴新图的方法会产生这个错误,怎么解决呢?

无法从带有索引像素格式的图像创建 Graphics 对象。

已赞过 已踩过<
你对这个回答的评价是?
评论 收起
Sxzy灬丨小柒
2014-10-30 · TA获得超过623个赞
知道小有建树答主
回答量:1223
采纳率:50%
帮助的人:274万
展开全部

我用你的代码试了一下 好使.

byte[] photo = null;
            MemoryStream ms = new MemoryStream();
            Bitmap bmp = new Bitmap(pb.Image);
            bmp.Save(ms, System.Drawing.Imaging.ImageFormat.Bmp);
            photo = new byte[ms.Length];
            ms.Position = 0;
            ms.Read(photo, 0, Convert.ToInt32(ms.Length));
            bmp.Dispose();
            MemoryStream ms1 = new MemoryStream(photo); 
            Image img = Image.FromStream(ms1);
            img.Save(@"C:\Users\samsung\Desktop\new1.bmp");

原BMP   1.bmp 48*30 4.27KB

新BMP    new1.bmp  48*30  5.67KB

 

参考

http://blog.csdn.net/azkabannull/article/details/7770157

追问
网址里面的方法不行的,转出时伪8位深度,真实深度还是24位的。只是处理了灰度而已。
本回答被网友采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
刷新①丅5e6
2014-10-30 · TA获得超过4333个赞
知道大有可为答主
回答量:1499
采纳率:64%
帮助的人:591万
展开全部
设置一下Image的PixelFormat属性,将其值设置为Format8bppIndexed
追问
这个属性是只读的。。。如果是new出来再贴一个新图上去就会报这个错误
无法从带有索引像素格式的图像创建 Graphics 对象。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
超大蒲公英
2014-10-30 · TA获得超过741个赞
知道小有建树答主
回答量:758
采纳率:75%
帮助的人:737万
展开全部
是不是对图片做修改了
追问

保存图片的时候用了这个方法,转换为byte再扔进数据库的

追答
using(var ms= new MemoryStream()){
pb.Image.Save(ms,pb.Image.RawFormat);
return ms.ToArray();

}
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 1条折叠回答
收起 更多回答(2)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式