数据流与Bitmap之间相互转换

2024-09-08 11:08

本文主要是介绍数据流与Bitmap之间相互转换,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

 

把获得的数据流转换成一副图片(Bitmap)

其原理就是把获得倒的数据流序列化到内存中,然后经过加工,在把数据从内存中反序列化出来就行了。

难点就是在如何实现加工。因为Bitmap有一个专有的格式,我们常称这个格式为数据头。加工的过程就是要把这个数据头与我们之前获得的数据流合并起来。(也就是要把这个头加入到我们之前获得的数据流的前面)

     那么这个头是什么呢?它是一个固定长度(14个byte)的数据。具体内容见代码。由于这个头是对任何Bitmap对象都是通用的,所以加入头的过程基本上都是一样的。代码如下:

 1 using System;

 2   using  System.Collections.Generic;
 3   using  System.Linq;
 4   using  System.Text;
 5   using  System.Drawing;
 6   using  System.IO;

 7 

 8   public   Bitmap AddHeader( byte [] imageDataDetails)
 9           {
10               Bitmap bitmap  =   null ;
11                int  length  =  imageDataDetails.GetLength( 0 );
12                using  (MemoryStream stream  =   new  MemoryStream(length  +   14 )) // 为头腾出14个长度的空间
13               {
14                    byte [] buffer  =   new   byte [ 13 ];
15                   buffer[ 0 =   0x42 ; // Bitmap 固定常数
16                   buffer[ 1 =   0x4d ; // Bitmap 固定常数
17                   stream.Write(buffer,  0 2 ); // 先写入头的前两个字节
18  
19                   // 把我们之前获得的数据流的长度转换成字节,
20                   // 这个是用来告诉“头”我们的实际图像数据有多大
21                    byte [] bytes  =  BitConverter.GetBytes(length);
22                   stream.Write(bytes,  0 4 ); // 把这个长度写入头中去
23                   buffer[ 0 =   0 ;
24                   buffer[ 1 =   0 ;
25                   buffer[ 2 =   0 ;
26                   buffer[ 3 =   0 ;
27                   stream.Write(buffer,  0 4 ); // 在写入4个字节长度的数据到头中去
28                    int  num2  =   0x36 ; // Bitmap 固定常数
29                   bytes  =  BitConverter.GetBytes(num2);
30                   stream.Write(bytes,  0 4 ); // 在写入最后4个字节的长度
31                   stream.GetBuffer();
32                   stream.Write(imageDataDetails,  0 , length); // 把实际的图像数据全部追加到头的后面
33                   bitmap  =   new  Bitmap(stream); // 用内存流构造出一幅bitmap的图片
34                   bitmap.RotateFlip(RotateFlipType.Rotate180FlipX);
35                   stream.Close();
36                    return  bitmap; // 最后就得到了我们想要的图片了

37             }

38         }


public Bitmap GetPicBitmap(byte[] pInputBuffer)
{
            try
            {
                MemoryStream tTempStream = new MemoryStream(pInputBuffer);
                Image tTempBitmap = Image.FromStream(tTempStream);

                return (Bitmap)tTempBitmap;
               }
               catch {
                return null;
               }
}





把一幅图片转换成字节数组

using System;
using System.IO;

public byte[] ToByte(Image imageData)
{
            MemoryStream Ms 
= new MemoryStream();
            image.Save(Ms, System.Drawing.Imaging.ImageFormat.bmp);
//把图像数据序列化到内存
            byte[] imgByte = new byte[Ms.Length];
            Ms.Position 
= 0;
            Ms.Read(imgByte, 
0, Convert.ToInt32(Ms.Length));//反序列,存放在字节数组里
            Ms.Close();

            return imgByte;//这里我们就得到了图像的字节数组了

}

复制代码

这篇关于数据流与Bitmap之间相互转换的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1147937

相关文章

Linux使用dd命令来复制和转换数据的操作方法

《Linux使用dd命令来复制和转换数据的操作方法》Linux中的dd命令是一个功能强大的数据复制和转换实用程序,它以较低级别运行,通常用于创建可启动的USB驱动器、克隆磁盘和生成随机数据等任务,本文... 目录简介功能和能力语法常用选项示例用法基础用法创建可启动www.chinasem.cn的 USB 驱动

Python 标准库time时间的访问和转换问题小结

《Python标准库time时间的访问和转换问题小结》time模块为Python提供了处理时间和日期的多种功能,适用于多种与时间相关的场景,包括获取当前时间、格式化时间、暂停程序执行、计算程序运行时... 目录模块介绍使用场景主要类主要函数 - time()- sleep()- localtime()- g

JAVA中整型数组、字符串数组、整型数和字符串 的创建与转换的方法

《JAVA中整型数组、字符串数组、整型数和字符串的创建与转换的方法》本文介绍了Java中字符串、字符数组和整型数组的创建方法,以及它们之间的转换方法,还详细讲解了字符串中的一些常用方法,如index... 目录一、字符串、字符数组和整型数组的创建1、字符串的创建方法1.1 通过引用字符数组来创建字符串1.2

Java将时间戳转换为Date对象的方法小结

《Java将时间戳转换为Date对象的方法小结》在Java编程中,处理日期和时间是一个常见需求,特别是在处理网络通信或者数据库操作时,本文主要为大家整理了Java中将时间戳转换为Date对象的方法... 目录1. 理解时间戳2. Date 类的构造函数3. 转换示例4. 处理可能的异常5. 考虑时区问题6.

基于C#实现将图片转换为PDF文档

《基于C#实现将图片转换为PDF文档》将图片(JPG、PNG)转换为PDF文件可以帮助我们更好地保存和分享图片,所以本文将介绍如何使用C#将JPG/PNG图片转换为PDF文档,需要的可以参考下... 目录介绍C# 将单张图片转换为PDF文档C# 将多张图片转换到一个PDF文档介绍将图片(JPG、PNG)转

day-51 合并零之间的节点

思路 直接遍历链表即可,遇到val=0跳过,val非零则加在一起,最后返回即可 解题过程 返回链表可以有头结点,方便插入,返回head.next Code /*** Definition for singly-linked list.* public class ListNode {* int val;* ListNode next;* ListNode() {}*

【每日一题】LeetCode 2181.合并零之间的节点(链表、模拟)

【每日一题】LeetCode 2181.合并零之间的节点(链表、模拟) 题目描述 给定一个链表,链表中的每个节点代表一个整数。链表中的整数由 0 分隔开,表示不同的区间。链表的开始和结束节点的值都为 0。任务是将每两个相邻的 0 之间的所有节点合并成一个节点,新节点的值为原区间内所有节点值的和。合并后,需要移除所有的 0,并返回修改后的链表头节点。 思路分析 初始化:创建一个虚拟头节点

PDF 软件如何帮助您编辑、转换和保护文件。

如何找到最好的 PDF 编辑器。 无论您是在为您的企业寻找更高效的 PDF 解决方案,还是尝试组织和编辑主文档,PDF 编辑器都可以在一个地方提供您需要的所有工具。市面上有很多 PDF 编辑器 — 在决定哪个最适合您时,请考虑这些因素。 1. 确定您的 PDF 文档软件需求。 不同的 PDF 文档软件程序可以具有不同的功能,因此在决定哪个是最适合您的 PDF 软件之前,请花点时间评估您的

C# double[] 和Matlab数组MWArray[]转换

C# double[] 转换成MWArray[], 直接赋值就行             MWNumericArray[] ma = new MWNumericArray[4];             double[] dT = new double[] { 0 };             double[] dT1 = new double[] { 0,2 };

linux中使用rust语言在不同进程之间通信

第一种:使用mmap映射相同文件 fn main() {let pid = std::process::id();println!(