C# - 图片操作和Base64处理

旋转

(1)按角度旋转

(2)按弧度旋转

以上参考:基于C#的两种图片旋转方法

此外,可以直接使用已封装的方法:

转换

(1)Bitmap & BitmapImage

若是将Bitmap转换成BitmapSource,只需将返回值类型更改为BitmapSource即可。

具体参考:Converting BitmapImage to Bitmap and vice versa

(2)Bitmap/BitmapImage & byte[]

此时,可以总结下Bitmap、BitmapImage、Image和BitmapSource、ImageSource之间的关系

1
2
3
4
5
6
7
// Image抽象类,Bitmap密封类
public abstract class Image: xxx
public sealed class Bitmap : Image
// ImageSource和BitmapSource抽象类,BitmapImage密封类
public abstract class ImageSource: xxx
public abstract class BitmapSource : ImageSource
public sealed class BitmapImage : BitmapSource

压缩

图片大小 > 1M 时,可以对图片进行压缩,有效减小图片大小、占用内存空间等。

提供一个在工作中压缩图片的方法

Base64处理

最常见的用于传输8Bit字节码的编码方式之一,可以将任意一组字节转换为较长的常见文本字符序列,从而可以合法地作为首部字段值

  • Base64:一种基于64个可打印字符以及用作后缀的等号来表示二进制数据的方法
  • Base64编码:从二进制到字符的过程,可用于在HTTP环境下传递较长的标识信息
  • 编码规则:每三个8Bit的字节转换为四个6Bit的字节(3*8 = 4*6 = 24),然后把6Bit再添两位高位0,组成四个8Bit的字节,也就是说,转换后的字符串理论上将要比原来的长1/3个字符变成4个字符,每76个字符加一个换行符,最后的结束符也要处理

其中,64个可打印字符包括:大小写字母、数字、 + 和 / 。相关特点:

  • 把含有不可见字符串的信息用可见字符串表示出来、降低出错率,但具有不可读性、需解码
  • 二进制序列的长度必须是24的倍数(6和8的最小公倍数)
  • 等号一定用作后缀,且数目一定是0个、1个或2个
  • 因为将3个字节转化成4个字节,因此编码后的文本,会比原文本大出三分之一左右
1
['A', 'B', 'C', 'D', ... 'a', 'b', 'c', 'd', ... '0', '1', '2', ... '+', '/']

注意,标准的Base64编码存在 '+'和 '/',针对URL,通过"url safe"的base64编码,将 '+'和 '/' 分别变成 '-'和 '_',同时会删除结果最后的 '='

1
2
3
4
>>> base64.b64encode('i\xb7\x1d\xfb\xef\xff')
'abcd++//'
>>> base64.urlsafe_b64encode('i\xb7\x1d\xfb\xef\xff')
'abcd--__'

对于二进制序列长度必须是24倍数的解释:正常情况下,只要长度是6的倍数即可。但是,当连接两段Base64编码过的字符串后再解码,这个时候就需要6和8的公倍数,即长度必须是24的倍数。

现在浏览器已有内置的自动生成base64的方法 atob() btoa()

1
2
3
4
// 编码
window.btoa()
// 解码
window.atob()

具体参见:window.btoa()window.atob()

注意,待编码字符串若包含中文,直接编码会出现问题,应采用如下方式

1
2
3
4
5
6
7
8
9
10
function utf8_to_b64( str ) {
    return window.btoa(
        unescape(
            encodeURIComponent( str )));
}
function b64_to_utf8( str ) {
    return decodeURIComponent(
        escape(
            window.atob( str )));
}

计算图片大小

一种计算大小方法:base64图片计算大小,供参考

 

参考

posted @   万箭穿心,习惯就好。  阅读(3039)  评论(0编辑  收藏  举报
编辑推荐:
· Linux glibc自带哈希表的用例及性能测试
· 深入理解 Mybatis 分库分表执行原理
· 如何打造一个高并发系统?
· .NET Core GC压缩(compact_phase)底层原理浅谈
· 现代计算机视觉入门之:什么是图片特征编码
阅读排行:
· 手把手教你在本地部署DeepSeek R1,搭建web-ui ,建议收藏!
· Spring AI + Ollama 实现 deepseek-r1 的API服务和调用
· 数据库服务器 SQL Server 版本升级公告
· 程序员常用高效实用工具推荐,办公效率提升利器!
· C#/.NET/.NET Core技术前沿周刊 | 第 23 期(2025年1.20-1.26)
点击右上角即可分享
微信分享提示