2015-09-04 59 views
-1

有人可以解释我如何将图像转换为字节数组? 我需要这个理论。 我想使用图像进行AES加密{VB .Net),所以在我使用OpenFile对话框后,我的应用程序将加载图像,然后将其处理成字节数组,但我需要该过程的解释(像素如何转换为字节数组) 感谢您的回答,并对初学者问题感到抱歉。 参考链接接受:)处理图像到字节数组的说明

+0

您可以直接使用该文件内容的字节数组。 –

+0

使用'File,ReadAllBytes()'它只是屏幕上的像素 – Plutonix

回答

0

每个像素是一个字节和图像是由3或4个字节,取决于其模式。某些图像每像素有3个字节(与红色,贪婪和蓝色有关),其他格式可能需要4个字节(ALpha通道,R,G和B)。

您可以使用类似:

Dim NewByteArray as Byte() = File.ReadAllbytes("c:\folder\image") 

NewByteArray将图像的每一个字节得到满足,并且需要使用AES,无论其位置或含义来处理它们。

1

当您通过File.ReadAllBytes()从图像文件中读取字节时,它们的含义取决于图像的文件格式。
图像文件格式(例如位图,PNG,JPEG2000)定义了像素值如何转换为字节,反之亦然,您如何从字节中获取像素值。
PNG和JPEG格式是压缩格式,所以你很难编写代码来做到这一点。对于位图而言,这将是相当简单的,因为它是一种简单的格式。 (见维基百科)

但它更简单。您可以使用.NET的Bitmap类将任何常见图像文件加载到内存中,然后使用Bitmap.GetPixel()通过它们的x,y坐标访问像素。尽管如此,
Bitmap.GetPixel()对于较大的图像速度较慢。为了加快速度,您需要直接在内存中访问像素的原始表示。无论您使用Bitmap类加载何种图像,它总是在内存中为其创建一个Bitmap表示。其确切的布局取决于Bitmap.PixelFormat。您可以使用像this这样的模式访问它。工作流程如下:

  1. 使用Bitmap.LockBits()Marshal.Copy()将存储位图复制到字节数组。
  2. 使用例如从字节阵列提取R,G,B值。这个公式中的PixelFormat.RGB24情况:

    // Access pixel at (x,y) 
    B = bytes[bitmapData.Scan0 + x * 3 + y * bitmapData.Stride + 0] 
    G = bytes[bitmapData.Scan0 + x * 3 + y * bitmapData.Stride + 1] 
    R = bytes[bitmapData.Scan0 + x * 3 + y * bitmapData.Stride + 2] 
    

    或为PixelFormat.RGB32

    // Access pixel at (x,y) 
    B = bytes[bitmapData.Scan0 + x * 4 + y * bitmapData.Stride + 0] 
    G = bytes[bitmapData.Scan0 + x * 4 + y * bitmapData.Stride + 1] 
    R = bytes[bitmapData.Scan0 + x * 4 + y * bitmapData.Stride + 2] 
    A = bytes[bitmapData.Scan0 + x * 4 + y * bitmapData.Stride + 3]