`

JPEG文件数据结构以及将位图保存为JPG的代码 转2

阅读更多

三、实例分析
  用系统自带的画图程序画一个32×24的红色方块,另存为JPG文件,这个文件的全部数据如下:

0000: FF D8 FF E0 00 10 4A 46 49 46 00 01 01 01 00 60
0010: 00 60 00 00 FF DB 00 43 00 08 06 06 07 06 05 08
0020: 07 07 07 09 09 08 0A 0C 14 0D 0C 0B 0B 0C 19 12
0030: 13 0F 14 1D 1A 1F 1E 1D 1A 1C 1C 20 24 2E 27 20
0040: 22 2C 23 1C 1C 28 37 29 2C 30 31 34 34 34 1F 27
0050: 39 3D 38 32 3C 2E 33 34 32 FF DB 00 43 01 09 09
0060: 09 0C 0B 0C 18 0D 0D 18 32 21 1C 21 32 32 32 32
0070: 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32
0080: 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32
0090: 32 32 32 32 32 32 32 32 32 32 32 32 32 32 FF C0
00A0: 00 11 08 00 18 00 20 03 01 22 00 02 11 01 03 11
00B0: 01 FF C4 00 1F 00 00 01 05 01 01 01 01 01 01 00
00C0: 00 00 00 00 00 00 00 01 02 03 04 05 06 07 08 09
00D0: 0A 0B FF C4 00 B5 10 00 02 01 03 03 02 04 03 05
00E0: 05 04 04 00 00 01 7D 01 02 03 00 04 11 05 12 21
00F0: 31 41 06 13 51 61 07 22 71 14 32 81 91 A1 08 23
0100: 42 B1 C1 15 52 D1 F0 24 33 62 72 82 09 0A 16 17
0110: 18 19 1A 25 26 27 28 29 2A 34 35 36 37 38 39 3A
0120: 43 44 45 46 47 48 49 4A 53 54 55 56 57 58 59 5A
0130: 63 64 65 66 67 68 69 6A 73 74 75 76 77 78 79 7A
0140: 83 84 85 86 87 88 89 8A 92 93 94 95 96 97 98 99
0150: 9A A2 A3 A4 A5 A6 A7 A8 A9 AA B2 B3 B4 B5 B6 B7
0160: B8 B9 BA C2 C3 C4 C5 C6 C7 C8 C9 CA D2 D3 D4 D5
0170: D6 D7 D8 D9 DA E1 E2 E3 E4 E5 E6 E7 E8 E9 EA F1
0180: F2 F3 F4 F5 F6 F7 F8 F9 FA FF C4 00 1F 01 00 03
0190: 01 01 01 01 01 01 01 01 01 00 00 00 00 00 00 01
01A0: 02 03 04 05 06 07 08 09 0A 0B FF C4 00 B5 11 00
01B0: 02 01 02 04 04 03 04 07 05 04 04 00 01 02 77 00
01C0: 01 02 03 11 04 05 21 31 06 12 41 51 07 61 71 13
01D0: 22 32 81 08 14 42 91 A1 B1 C1 09 23 33 52 F0 15
01E0: 62 72 D1 0A 16 24 34 E1 25 F1 17 18 19 1A 26 27
01F0: 28 29 2A 35 36 37 38 39 3A 43 44 45 46 47 48 49
0200: 4A 53 54 55 56 57 58 59 5A 63 64 65 66 67 68 69
0210: 6A 73 74 75 76 77 78 79 7A 82 83 84 85 86 87 88
0220: 89 8A 92 93 94 95 96 97 98 99 9A A2 A3 A4 A5 A6
0230: A7 A8 A9 AA B2 B3 B4 B5 B6 B7 B8 B9 BA C2 C3 C4
0240: C5 C6 C7 C8 C9 CA D2 D3 D4 D5 D6 D7 D8 D9 DA E2
0250: E3 E4 E5 E6 E7 E8 E9 EA F2 F3 F4 F5 F6 F7 F8 F9
0260: FA FF DA 00 0C 03 01 00 02 11 03 11 00 3F 00 E2
0270: E8 A2 8A F9 93 F7 10 A2 8A 28 00 A2 8A 28 00 A2
0280: 8A 28 03 FF D9

分析:
0000-0001:FF D8(文件头)
0002-0013:APP0段,其中:
  0002-0003:FF E0(段标记)
  0004-0005:00 10(段长度=16字节)
  0006-000A:4A 46 49 46 00(“JFIF”的ASCII码)
  000B-000C:01 01(主次版本号=1.01)
  000D     :01(密度单位为 点数/英寸)
  000E-0011:00 60 00 60(水平和垂直的密度均为每英寸96像素)
  0012-0013:00 00(没有缩略图)
0014-0058:DQT段,其中:
  0014-0015:FF DB(段标记)
  0016-0017:00 43(段长度=67字节)
  0018     :00(QT号=0,QT精度=8bit)
  0019-0058:QT
0059-009D:DQT段,其中:
  0059-005A:FF DB(段标记)
  005B-005C:00 43(段长度=67字节)
  005D     :01(QT号=1,QT精度=8bit)
  005E-009D:QT
009E-00B0:SOF0段,其中:
  009E-009F:FF C0(段标记)
  00A0-00A1:00 11(段长度=17字节)
  00A2     :08(样本精度=8bit)
  00A3-00A6:00 18 00 20(图像高=24,图像宽=32)
  00A7     :03(组件数量=3,YCbCr彩色图)
  00A8     :01(ID号=1,这是亮度Y组件)
  00A9     :22(化为二进制=00100010,表明垂直和水平采样系数均=2)
  00AA     :00(使用QT号=0的量化表)
  00AB     :02(ID号=2,这是色度Cb组件)
  00AC     :11(化为二进制=00010001,表明垂直和水平采样系数均=1)
  00AD     :01(使用QT号=1的量化表)
  00AE     :03(ID号=3,这是色度Cr组件)
  00AF     :11(化为二进制=00010001,表明垂直和水平采样系数均=1)
  00B0     :01(使用QT号=1的量化表)
00B1-00D1:DHT段,其中:
  00B1-00B2:FF C4(段标记)
  00B3-00B4:00 1F(段长度=31字节)
  00B5     :00(HT号=0,DC表)
  00B6-00C5:这16个数字之和=12,说明下面的HT值表的长度=12字节)
  00C6-00D1:HT值表
00D2-0188:DHT段,这是HT号=0的AC表,参照上面分析
0189-01A9:DHT段,这是HT号=1的DC表,参照上面分析
01AA-0260:DHT段,这是HT号=1的AC表,参照上面分析
0261-026E:SOS段,其中:
  0261-0262:FF DA(段标记)
  0263-0264:00 0C(段长度=12字节)
  0265     :03(组件数量=3)
  0266-0267:01 00(组件ID=1,Y组件,使用HT表号=0的AC表)
  0268-0269:02 11(组件ID=2,Cb组件,使用HT表号=1的DC表)
  026A-026B:03 11(组件ID=3,Cr组件,使用HT表号=1的DC表)
  026C-026E:00 3F 00(几乎每个JPG文件中这3个字节的值都相同,但用途不明)
026F-0282:图像压缩数据
0283-0284:FF D9(文件尾)

 

作者:一江秋水      发表时间:2010-1-30 10:00:00

 3楼  


四、将位图保存为JPG的函数代码:

Option Explicit

Private Declare Function CLSIDFromString Lib "ole32" (ByVal str As Long, id As GUID) As Long
Private Declare Sub CopyMemory Lib "KERNEL32" Alias "RtlMoveMemory" (lpvDest As Any, lpvSource As Any, ByVal cbCopy As Long)
Private Declare Function GdipCreateBitmapFromHBITMAP Lib "gdiplus" (ByVal hbm As Long, ByVal hpal As Long, Bitmap As Long) As Long
Private Declare Function GdiplusStartup Lib "gdiplus.dll" (ByRef token As Long, ByRef inputX As GdiplusStartupInput, ByVal Output As Long) As Long
Private Declare Function GdipSaveImageToFile Lib "gdiplus" (ByVal Image As Long, ByVal Filename As Long, clsidEncoder As GUID, encoderParams As Any) As Long
Private Declare Function GdipDisposeImage Lib "gdiplus" (ByVal Image As Long) As Long
Private Declare Function GdiplusShutdown Lib "gdiplus.dll" (ByVal token As Long) As Long

Private Type GUID
  Data1  As Long
  Data2  As Integer
  Data3  As Integer
  Data4(0 To 7) As Byte
End Type
Private Type GdiplusStartupInput
  GdiplusVersion As Long
  DebugEventCallback As Long
  SuppressBackgroundThread As Long
  SuppressExternalCodecs As Long
End Type
Private Type EncoderParameter
  GUID As GUID
  NumberOfvalues  As Long
  type As Long
  Value As Long
End Type
Private Type EncoderParameters
  Count As Long
  Parameter As EncoderParameter
End Type

'输入参数:必需的:1.对象;2.要保存的全路径文件名;可选的:3.jpg品质因素
Private Function SaveJpg(ByVal pict As StdPicture, ByVal Filename As String, Optional ByVal JPG_Quality As Byte = 80) As Boolean
On Error GoTo 100
Dim lGDIP As Long
Dim lBitmap As Long
Dim aEncParams() As Byte
Dim udtData As GdiplusStartupInput

udtData.GdiplusVersion = 1 'GDI+初始化
If GdiplusStartup(lGDIP, udtData, 0) = 0 Then
  If GdipCreateBitmapFromHBITMAP(pict.Handle, 0, lBitmap) = 0 Then '从句柄创建 GDI+ 图像
    Dim tJpgEncoder As GUID
    Dim tParams As EncoderParameters
    CLSIDFromString StrPtr("{557CF401-1A04-11D3-9A73-0000F81EF32E}"), tJpgEncoder '初始化解码器的GUID标识
    tParams.Count = 1      '设置解码器参数
    With tParams.Parameter '设置品质因数
      CLSIDFromString StrPtr("{1D5BE4B5-FA4A-452D-9CDD-5DB35105E7EB}"), .GUID '获取JPG_Quality参数的GUID标识
      .NumberOfvalues = 1
      .type = 4
      .Value = VarPtr(JPG_Quality)
    End With
    ReDim aEncParams(1 To Len(tParams))
    Call CopyMemory(aEncParams(1), tParams, Len(tParams))
    GdipSaveImageToFile lBitmap, StrPtr(Filename), tJpgEncoder, aEncParams(1) '保存图像
    GdipDisposeImage lBitmap '销毁GDI+图像
    GdiplusShutdown lGDIP
    Erase aEncParams
    SavePic = True
  End If
End If
Exit Function
100
End Function

 

分享到:
评论

相关推荐

    JPEG文件数据结构以及将位图保存为JPG的代码.docx

    这个过程涉及到读取BMP文件的像素数据,执行上述的JPEG压缩步骤,然后按照JPEG数据结构将编码后的数据写入文件。 总结来说,JPEG是一种高效但有损的图像压缩格式,通过颜色转换、DCT、量化和编码等步骤实现压缩,其...

    JPEG文件数据结构以及将位图保存为JPG的代码.pdf

    【JPEG文件格式详解】 JPEG(Joint Photographic Experts ...理解JPEG文件的数据结构和压缩原理对于处理和优化JPEG图像至关重要,无论是开发图像处理软件还是进行图像压缩算法的研究,这些基础知识都是必不可少的。

    opencv中mat与jpeg相互转换及显示代码

    首先,创建一个`CImage`对象,然后使用OpenCV的`imwrite`将`Mat`保存到临时文件,再读取到`CImage`,最后将`CImage`转换为`CBitmap`: ```cpp CImage image; cv::imwrite("temp.jpg", matImage); // 将Mat写入...

    实现位图文件转化为JPEG文件

    在某些场景下,例如网络传输或存储空间有限的情况下,将位图文件转换为JPEG格式是很有必要的。本文将详细介绍如何实现这一转换过程,并探讨其中涉及的关键技术和步骤。 首先,我们需要理解位图文件的结构。位图文件...

    jpg jpeg 解码 转 bmp RGB vs2013 c++

    在图像处理领域,JPEG、JPEG(也写作JPG)和BMP是三种常见的位图文件格式,每种格式都有其特定的应用场景和编码方式。本文将深入探讨如何使用C++在Visual Studio 2013环境下,从JPEG图像转换为BMP图像,涉及的主要...

    使用JpegLib,将bmp转换jpg -- 源码

    2. **数据解码**:读取BMP图像的像素数据,由于BMP通常是RGB格式,你需要将这些像素数据解码为可以输入到JPEG编码器的格式。JpegLib通常期望YCbCr颜色空间的数据,所以可能需要进行颜色空间转换。 3. **创建JPEG编...

    jpg转bmp的C源代码

    `jpg2bmp.c`源代码中,首先会包含相关的库文件,比如`stdio.h`用于文件操作,`jpeglib.h`用于处理JPEG数据。然后,定义处理函数,如`read_jpg()`用于读取JPEG数据,`write_bmp()`用于创建并写入BMP文件。 在`read_...

    15种文件的数据结构

    9. **JPG文件数据结构**:JPEG(Joint Photographic Experts Group)是一种常见的有损压缩图像格式。VB6代码可以读取JPEG文件的头部信息,获取图像的宽度和高度,这对于显示和处理图像非常有用。 10. **BMP文件数据...

    BMP转换成JPG vc++6.0 实现 源代码 工程

    在编码过程中,图像被分割成8x8的块,每个块进行DCT,然后量化以减少数据量,最后通过霍夫曼编码或算术编码进行熵编码,形成最终的JPG文件。 在这个源代码工程中,开发者可能还考虑了色彩空间的转换,因为BMP通常...

    C语言BMP格式图片转JPEG格式图片

    BMP格式是一种位图文件格式,其数据结构相对简单,包含图像宽度、高度、颜色深度和实际像素数据。在C语言中,我们可以直接操作这些数据来读取和写入BMP文件。转换过程首先需要读取BMP文件的头部信息,解析出图像的...

    jpeg转bmp格式

    2. **解码JPEG数据**:JPEG数据是经过JPEG压缩算法压缩的,需要通过库函数(如`jpeg_start_decompress`和`jpeg_read_scanlines`)解码,还原为RGB像素数组。 3. **组织BMP文件结构**:BMP文件格式的结构与JPEG不同...

    BMP文件转换为JPG文件的源代码

    标题“BMP文件转换为JPG文件的源代码”提示我们,这是一个关于如何使用VC++编程语言将BMP图像转换为JPG格式的源代码示例。VC++是Microsoft开发的一个集成开发环境,用于编写基于Windows操作系统的应用程序,包括...

    Jpeg_Decompress.rar_JPEG 转 BMP_bmp转jpg的c代码_jpeg decompress_site:

    标题中的“Jpeg_Decompress.rar”是一个压缩文件,其中包含了一个名为“Jpeg_Decompress.c”的C源代码文件,这个源代码是用于处理JPEG图像格式与BMP图像格式转换的。JPEG(Joint Photographic Experts Group)是一种...

    ffmpeg库实现bmp转换为jpeg格式图像

    在`rgb2bmp.cpp`文件中,可能会有处理RGB图像到BMP转换的代码,因为BMP格式通常需要将像素数据从RGB转换为特定的内部格式。这个过程与上面的转换略有不同,主要是编码步骤,但基本的图像处理流程是相似的。 `__main...

    jpeg转变成prn文件

    2. **解析JPEG数据**:使用MFC中的CImage类或其他第三方库,如FreeImage,来解析JPEG文件,提取图像数据。这一步包括了解码JPEG的压缩数据,并将其转化为RGB或者其他颜色空间的像素数组。 3. **生成PRN指令**:创建...

    jpg转换成bmp格式源代码程序

    2. **解压缩JPEG数据**:JPEG是压缩格式,我们需要将其解压缩为原始的RGB像素数据。这个过程通常涉及反量化和IDCT(逆离散余弦变换)。 3. **创建BMP头信息**:BMP文件开头有一个包含图像大小、位深度、偏移量等...

    JPG文件转换成BMP文件

    2. **解码JPEG数据**:库会自动对JPEG数据进行解码,将其从压缩的YCbCr色彩空间转换回RGB色彩空间。 3. **创建BMP文件头**:BMP文件格式有一套固定的文件结构,包括文件头、位图信息头以及像素数据。你需要创建符合...

    BMP和JPG互转C++源代码

    BMP(Bitmap)是微软操作系统中的位图图像格式,它通常保存未经压缩的像素数据,因此文件体积较大。JPG(JPEG)则是一种广泛使用的有损压缩图像格式,适合存储照片或色彩丰富的图像,其压缩算法能够显著减小文件大小...

    BMP转JPG的vc源代码

    在给定的“BMP转JPG的vc源代码”中,我们可以深入理解如何在C++环境下,利用Visual C++(简称VC)开发工具将位图(BMP)文件转换为JPEG(JPG)格式的文件。BMP和JPG是两种常见的图像格式,各有特点:BMP是无损的,...

    bmp 转成 JPG 源代码

    5. **写入JPG文件**:将编码后的数据按照JPG文件格式的规范组织起来,写入新的JPG文件。JPG文件的头部包含一些元数据,比如图像尺寸、颜色空间、质量设置等。 在提供的`Bmptojpg`源代码中,这些步骤应该被实现为...

Global site tag (gtag.js) - Google Analytics