goG*_*Gud 56 c# image bytearray bitmap
我搜索了关于字节数组的所有问题,但我总是失败.我从未编写过c#我是这方面的新手.你能帮我解决一下如何从字节数组制作图像文件.
这是我的函数,它将字节存储在名为的数组中 imageData
public void imageReady( byte[] imageData, int fWidth, int fHeight))
Run Code Online (Sandbox Code Playgroud)
Mik*_*oud 99
你需要把它们bytes变成MemoryStream:
Bitmap bmp;
using (var ms = new MemoryStream(imageData))
{
bmp = new Bitmap(ms);
}
Run Code Online (Sandbox Code Playgroud)
那使用Bitmap(Stream stream)构造函数重载.
更新:请记住,根据文档和我一直在阅读的源代码,ArgumentException将会抛出以下条件:
stream does not contain image data or is null.
-or-
stream contains a PNG image file with a single dimension greater than 65,535 pixels.
Run Code Online (Sandbox Code Playgroud)
goG*_*Gud 23
伙计们,感谢您的帮助.我认为所有这些答案都有效.但是我认为我的字节数组包含原始字节.这就是为什么所有这些解决方案都不能用于我的代码.
但是我找到了解决方案.也许这个解决方案可以帮助其他有问题的编码员.
static byte[] PadLines(byte[] bytes, int rows, int columns) {
int currentStride = columns; // 3
int newStride = columns; // 4
byte[] newBytes = new byte[newStride * rows];
for (int i = 0; i < rows; i++)
Buffer.BlockCopy(bytes, currentStride * i, newBytes, newStride * i, currentStride);
return newBytes;
}
int columns = imageWidth;
int rows = imageHeight;
int stride = columns;
byte[] newbytes = PadLines(imageData, rows, columns);
Bitmap im = new Bitmap(columns, rows, stride,
PixelFormat.Format8bppIndexed,
Marshal.UnsafeAddrOfPinnedArrayElement(newbytes, 0));
im.Save("C:\\Users\\musa\\Documents\\Hobby\\image21.bmp");
Run Code Online (Sandbox Code Playgroud)
此解决方案适用于8位256 bpp(Format8bppIndexed).如果您的图像有其他格式,则应更改PixelFormat.
现在颜色有问题.一旦我解决了这个问题,我就会为其他用户编辑我的答案.
*PS =我不确定步幅值,但对于8位,它应该等于列.
此功能也适用于我..此功能将8位灰度图像复制为32位布局.
public void SaveBitmap(string fileName, int width, int height, byte[] imageData)
{
byte[] data = new byte[width * height * 4];
int o = 0;
for (int i = 0; i < width * height; i++)
{
byte value = imageData[i];
data[o++] = value;
data[o++] = value;
data[o++] = value;
data[o++] = 0;
}
unsafe
{
fixed (byte* ptr = data)
{
using (Bitmap image = new Bitmap(width, height, width * 4,
PixelFormat.Format32bppRgb, new IntPtr(ptr)))
{
image.Save(Path.ChangeExtension(fileName, ".jpg"));
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
Mar*_*num 15
可以这么简单:
var ms = new MemoryStream(imageData);
System.Drawing.Image image = Image.FromStream(ms);
image.Save("c:\\image.jpg");
Run Code Online (Sandbox Code Playgroud)
测试出来:
byte[] imageData;
// Create the byte array.
var originalImage = Image.FromFile(@"C:\original.jpg");
using (var ms = new MemoryStream())
{
originalImage.Save(ms, ImageFormat.Jpeg);
imageData = ms.ToArray();
}
// Convert back to image.
using (var ms = new MemoryStream(imageData))
{
Image image = Image.FromStream(ms);
image.Save(@"C:\newImage.jpg");
}
Run Code Online (Sandbox Code Playgroud)
此外,您可以简单地转换byte array为Bitmap.
var bmp = new Bitmap(new MemoryStream(imgByte));
Run Code Online (Sandbox Code Playgroud)
也可以直接Bitmap从文件路径获取。
Bitmap bmp = new Bitmap(Image.FromFile(filePath));
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
129032 次 |
| 最近记录: |