MemoryStream ms = new MemoryStream(); b.Save(ms, ImageFormat.Bmp); byte[] byte_h = new byte[54]; Array.ConstrainedCopy(ms.GetBuffer(), 0, byte_h, 0, 54); int data_start = BitConverter.ToInt32(byte_h, 0x0a); data_width = BitConverter.ToInt32(byte_h, 0x12); data_height = BitConverter.ToInt32(byte_h, 0x16); byte[] byte_data = new byte[data_height * data_width * 3]; Array.ConstrainedCopy(ms.GetBuffer(), data_start, byte_data, 0, data_width * data_height * 3); img = Image.FromStream(ms, true); ms.Close(); ms.Dispose(); return byte_data;
时间: 2024-04-27 22:19:32 浏览: 19
这段代码实现了将一个 Bitmap 对象转换为 byte 数组的功能。具体来说,代码首先创建了一个 MemoryStream 对象 ms,然后通过 Bitmap 对象 b 的 Save 方法将其保存为 BMP 格式的图片并写入到 ms 中。接着,代码创建了一个长度为 54 的 byte 数组 byte_h,并将 ms 中前 54 个字节(即 BMP 头信息)复制到 byte_h 中。通过解析 BMP 头信息,代码获取了图片数据的起始位置、宽度和高度等信息。然后,代码根据这些信息创建了一个长度为 data_height * data_width * 3 的 byte 数组 byte_data,并将 ms 中从数据起始位置开始到数据结束位置(即图片数据)的字节复制到 byte_data 中。最后,代码通过 FromStream 方法将 ms 中的数据转换为 Image 对象,释放 ms 对象并返回 byte_data 数组。
相关问题
c# 如果image过大,就缩小到指定dpi 参考 public bool SaveCheckPicture(string path, string fileName, Image img, out string msg) { msg = string.Empty; try { MemoryStream ms = new MemoryStream(); img.Save(ms, System.Drawing.Imaging.ImageFormat.Jpeg); byte[] data = new byte[ms.Length]; //ms.Read(data, 0, Convert.ToInt32(ms.Length)); data = ms.GetBuffer(); ms.Close(); img.Dispose(); return SaveCheckPicture(path, fileName, data, out msg); } catch (Exception ex) { msg = ex.ToString(); return false; } }
这段代码并没有直接对图片进行DPI调整。类似于之前的回答,如果想要通过缩小DPI来控制图片的显示大小,可以在将图片保存到内存流之前,使用Graphics对象对图片进行缩放和重新绘制。具体的代码实现如下:
```
public bool SaveCheckPicture(string path, string fileName, Image img, out string msg, int dpi = 96, int maxWidth = 0, int maxHeight = 0)
{
msg = string.Empty;
try
{
// 计算缩放比例
float scale = (float)dpi / img.HorizontalResolution;
// 计算缩放后的尺寸
int width = (int)(img.Width * scale);
int height = (int)(img.Height * scale);
// 如果指定了最大宽度或最大高度,则按比例缩放
if (maxWidth > 0 && width > maxWidth)
{
height = (int)(height * ((float)maxWidth / width));
width = maxWidth;
}
if (maxHeight > 0 && height > maxHeight)
{
width = (int)(width * ((float)maxHeight / height));
height = maxHeight;
}
// 创建缩放后的位图
Bitmap bmp = new Bitmap(width, height);
// 设置位图的DPI
bmp.SetResolution(dpi, dpi);
// 创建绘图对象
Graphics g = Graphics.FromImage(bmp);
g.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.HighQualityBicubic;
// 绘制缩放后的图片
g.DrawImage(img, new Rectangle(0, 0, width, height));
// 保存缩放后的图片
bmp.Save(Path.Combine(path, fileName), System.Drawing.Imaging.ImageFormat.Jpeg);
// 释放资源
g.Dispose();
bmp.Dispose();
img.Dispose();
return true;
}
catch (Exception ex)
{
msg = ex.ToString();
return false;
}
}
```
这段代码中,我们首先计算了缩放比例,并根据缩放比例创建了一个缩放后的位图。然后,我们根据指定的最大宽度和最大高度,按比例缩放图片。最后,我们创建了一个绘图对象,并设置了插值模式为高质量双立方插值。使用绘图对象将原始图片绘制到缩放后的位图上,并将缩放后的位图保存到指定的文件中。
需要注意的是,图片的缩放会影响图片的清晰度和细节,应根据实际需要进行取舍。另外,缩放后的图片尺寸可能会超出指定的最大宽度或最大高度,因此在保存缩放后的图片时,应该根据需要进行裁剪。
byte[] bytes = BitmapToByteArray(bmp); 可以指定图片格式嘛System.Drawing.Imaging.ImageFormat.Jpeg
是的,可以指定图片格式。在调用 `Bitmap.Save()` 方法时,可以传入一个 `System.Drawing.Imaging.ImageFormat` 枚举值,来指定保存的图片格式。该枚举包含了几种常见的图片格式,如 JPEG、PNG、BMP 等。
以下是示例代码:
```csharp
// 将 Bitmap 对象转换成指定格式的 byte[] 数组
public byte[] BitmapToByteArray(Bitmap bmp, ImageFormat format)
{
using (MemoryStream stream = new MemoryStream())
{
bmp.Save(stream, format);
return stream.ToArray();
}
}
```
使用示例:
```csharp
byte[] bytes = BitmapToByteArray(bmp, ImageFormat.Png); // 保存为 PNG 格式的字节数组
```
这样,就可以将 `Bitmap` 对象保存为指定格式的字节数组了。