数据流与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

相关文章

C#实现将Excel表格转换为图片(JPG/ PNG)

《C#实现将Excel表格转换为图片(JPG/PNG)》Excel表格可能会因为不同设备或字体缺失等问题,导致格式错乱或数据显示异常,转换为图片后,能确保数据的排版等保持一致,下面我们看看如何使用C... 目录通过C# 转换Excel工作表到图片通过C# 转换指定单元格区域到图片知识扩展C# 将 Excel

C++使用printf语句实现进制转换的示例代码

《C++使用printf语句实现进制转换的示例代码》在C语言中,printf函数可以直接实现部分进制转换功能,通过格式说明符(formatspecifier)快速输出不同进制的数值,下面给大家分享C+... 目录一、printf 原生支持的进制转换1. 十进制、八进制、十六进制转换2. 显示进制前缀3. 指

使用Python开发一个带EPUB转换功能的Markdown编辑器

《使用Python开发一个带EPUB转换功能的Markdown编辑器》Markdown因其简单易用和强大的格式支持,成为了写作者、开发者及内容创作者的首选格式,本文将通过Python开发一个Markd... 目录应用概览代码结构与核心组件1. 初始化与布局 (__init__)2. 工具栏 (setup_t

Java中Date、LocalDate、LocalDateTime、LocalTime、时间戳之间的相互转换代码

《Java中Date、LocalDate、LocalDateTime、LocalTime、时间戳之间的相互转换代码》:本文主要介绍Java中日期时间转换的多种方法,包括将Date转换为LocalD... 目录一、Date转LocalDateTime二、Date转LocalDate三、LocalDateTim

golang获取当前时间、时间戳和时间字符串及它们之间的相互转换方法

《golang获取当前时间、时间戳和时间字符串及它们之间的相互转换方法》:本文主要介绍golang获取当前时间、时间戳和时间字符串及它们之间的相互转换,本文通过实例代码给大家介绍的非常详细,感兴趣... 目录1、获取当前时间2、获取当前时间戳3、获取当前时间的字符串格式4、它们之间的相互转化上篇文章给大家介

Python实现AVIF图片与其他图片格式间的批量转换

《Python实现AVIF图片与其他图片格式间的批量转换》这篇文章主要为大家详细介绍了如何使用Pillow库实现AVIF与其他格式的相互转换,即将AVIF转换为常见的格式,比如JPG或PNG,需要的小... 目录环境配置1.将单个 AVIF 图片转换为 JPG 和 PNG2.批量转换目录下所有 AVIF 图

详解如何通过Python批量转换图片为PDF

《详解如何通过Python批量转换图片为PDF》:本文主要介绍如何基于Python+Tkinter开发的图片批量转PDF工具,可以支持批量添加图片,拖拽等操作,感兴趣的小伙伴可以参考一下... 目录1. 概述2. 功能亮点2.1 主要功能2.2 界面设计3. 使用指南3.1 运行环境3.2 使用步骤4. 核

Java实现时间与字符串互相转换详解

《Java实现时间与字符串互相转换详解》这篇文章主要为大家详细介绍了Java中实现时间与字符串互相转换的相关方法,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录一、日期格式化为字符串(一)使用预定义格式(二)自定义格式二、字符串解析为日期(一)解析ISO格式字符串(二)解析自定义

在java中如何将inputStream对象转换为File对象(不生成本地文件)

《在java中如何将inputStream对象转换为File对象(不生成本地文件)》:本文主要介绍在java中如何将inputStream对象转换为File对象(不生成本地文件),具有很好的参考价... 目录需求说明问题解决总结需求说明在后端中通过POI生成Excel文件流,将输出流(outputStre

python+opencv处理颜色之将目标颜色转换实例代码

《python+opencv处理颜色之将目标颜色转换实例代码》OpenCV是一个的跨平台计算机视觉库,可以运行在Linux、Windows和MacOS操作系统上,:本文主要介绍python+ope... 目录下面是代码+ 效果 + 解释转HSV: 关于颜色总是要转HSV的掩膜再标注总结 目标:将红色的部分滤