1.VB .bmp数据问题!
2.BMP协议:可手动解码的数据传输/保存协议(含源代码)
3.BMP图像解码器源代码?C++编的
VB .bmp数据问题!
Option Explicit
Private Declare Function SetPixelV Lib "gdi" (ByVal hdc As Long, ByVal x As Long, ByVal y As Long, ByVal crColor As Long) As Long
Private Sub Form_Click()
Dim iFN As Integer
Dim bTemp() As Byte
Dim lFlen As Long
Dim DataOffset As Long
Dim Width As Long
Dim Height As Long
Dim PerPixel As Long
Dim Compression As Long
Dim sFileName As String
Dim h As Long
Dim w As Long
Dim R As Integer
Dim G As Integer
Dim B As Integer
Dim t As Long
Dim qq As Long
Dim t1 As Long
sFileName = InputBox("Path:", "BMP文件路径", "C:\pt.bmp")
lFlen = FileLen(sFileName)
ReDim bTemp(lFlen)
iFN = FreeFile
Open sFileName For Binary As iFN
Get #iFN, 1, bTemp() '将BMP文件以二进制方式打开,存入数组
Close iFN
If Not (bTemp(0) = &H And bTemp(1) = &H4D) Then MsgBox ("这不是BMP文件"): Exit Sub
DataOffset = DCombineBytes(bTemp(), bTemp(), bTemp(), bTemp()) '偏移量
Width = DCombineBytes(bTemp(), bTemp(), bTemp(), bTemp()) '位图的宽度
Height = DCombineBytes(bTemp(), bTemp(), bTemp(), bTemp()) '位图的高度
PerPixel = WCombineBytes(bTemp(), bTemp()) '每个象素的位数
Compression = bTemp() '是否压缩
If Compression <> 0 Then MsgBox ("此程序只能处理非压缩的BMP图像"): Exit Sub
If PerPixel <> And PerPixel <> Then MsgBox ("此程序只能处理位或位的BMP图像"): Exit Sub
If PerPixel = Then t1 = 3 Else t1 = 4
For h = Height To 1 Step -1
For w = Width To 1 Step -1
B = bTemp(t)
G = bTemp(t + 1)
R = bTemp(t + 2)
qq = SetPixelV(Form1.hdc, w, h, RGB(R, G, B))
t = t + t1
Next w
Next h
End Sub
Private Function WCombineBytes(lsb As Byte, msb As Byte) As Long
WCombineBytes = CLng(lsb + (msb * )) '把word十六进制数换成十进制
End Function
Private Function DCombineBytes(lsb As Byte, msb As Byte, hsb As Byte, ksb As Byte) As Long
DCombineBytes = CLng(lsb + (msb * ) + (hsb * ) + (ksb * )) '把dword十六进制数换成十进制
End Function
BMP协议:可手动解码的数据传输/保存协议(含源代码)
通常情况下,由红、绿、在线教育网源码蓝三种颜色组成,即RGB显示。
在中,红、绿、蓝通道通常都是8位深度,被称为位位图。授权网站源码博客
因此,一个像素的颜色信息总是包含3个字节。
换句话说,我们可以将任何信息嵌入到像素的颜色中。
只要能无损地保存每个像素的信息,例如:
1. BMP格式(位图)
bmp格式可以直接保存每个像素点的mg冰球突破源码颜色信息,并且这些信息在存储上是连续的。这非常适合我们的需求。
这里使用的特定bmp格式的文件头大致如下:
将对应的值填入,然后写入像素颜色(文件数据)即可。
但是,这里有一个小问题,宽屏补丁源码BMP每行的数据量必须是4n字节,不足的部分需要向上补齐。(n为整数)
换句话说,由于每个像素有3字节,最好让每行有4n个像素,以免出现问题。热门框架源码
理论上,我们可以将任何文件直接放入另一个中:
要从文件乙提取文件甲,直接从文件乙的第个字节读取并保存即可。
然而,这里还有一个问题:
1. 不是所有文件大小都是的整数倍。
2. 如果m和n的差距很大,就会变成条状。
因此,除非原文件可以在末尾添加一些无用信息后仍然正常使用,或者有其他方式得知文件的实际大小,否则我们需要另外封装一个中间层:
...不过,一般来说,因为我传输的是文本文件(源代码),所以在最后加上一大堆空格补齐即可,并不需要使用这个方法。
来试试手:
《另存为.cpp》
查看的方式:
当然,如果你缺少bionukg_graphics.h这个我自己写的头文件,肯定编译不出来。
它在这里,请自取:
保存之后取不出来?
虽然服务器上保存的格式通常是无损的,但并不代表你可以用bmp的方式直接提取。
你需要另存为位位图文件,然后再提取。
BMP图像解码器源代码?C++编的
#include <jpeg.hpp>
void Bitmap2Jpeg(AnsiString bmpFile, AnsiString jpegFile)
{
Graphics::TBitmap *bitmap = new Graphics::TBitmap();
bitmap->LoadFromFile(bmpFile);
TJPEGImage *jpeg = new TJPEGImage();
try {
jpeg->Assign(bitmap);
jpeg->SaveToFile(jpegFile);
}
__finally {
delete jpeg;
}
delete bitmap;
}
void Jpeg2Bitmap(AnsiString jpegFile, AnsiString bmpFile)
{
Graphics::TBitmap *bmp = new Graphics::TBitmap();
TJPEGImage *jpeg = new TJPEGImage();
jpeg->LoadFromFile(jpegFile);
bmp->Assign(jpeg);
bmp->SaveToFile(bmpFile);
delete jpeg;
delete bmp;
}