我的做法是:
nColors = 256
ReDim BMI.bmiColors(0 To nColors - 1) As RGBQUAD
For k = 0 To 255
With BMI.bmiColors(k)
.Blue = k
.Green = k
.Red = k
.Reserved = 0
End With
Next可是输出是绿色一片,上面有些杂七杂八的点。:(
nColors = 256
ReDim BMI.bmiColors(0 To nColors - 1) As RGBQUAD
For k = 0 To 255
With BMI.bmiColors(k)
.Blue = k
.Green = k
.Red = k
.Reserved = 0
End With
Next可是输出是绿色一片,上面有些杂七杂八的点。:(
需要在AVIStreamSetFormat函数中将bitmapinfo结构传进去,另外注意一下你的BMI.BitmapInfoHeader结构中的biClrUsed是不是=256
比如:AVIStreamSetFormat(lngCompressedStreamHandle, 0, ByVal VarPtr(BMI), Len(BMI))另外AVIStreamSetFormat函数只能在第一次调用的时候传入调色板信息,如果要修改调色板信息必须在写入若干帧数据以后才能再改
BMI.bmiHeader.biSizeImage = BytesPerScanLine8(96) * 64
BMI.bmiHeader.biClrUsed = 256
biSizeImage8 = BytesPerScanLine8(96) * 64
ReDim pVidStreamNew(biSizeImage8 + 1) As Byte
nColors = 256
ReDim BMI.bmiColors(0 To nColors - 1) As RGBQUAD
For k = 0 To 255
With BMI.bmiColors(k)
.Blue = CByte(k)
.Green = CByte(k)
.Red = CByte(k)
.Reserved = 0
End With
Next
AVIStreamSetFormat pVidStreamOut, 0, ByVal VarPtr(BMI), Len(BMI)
For k = 0 To biSizeImage8 - 1
luminance = (pVidStreamOld(j + 2) * 0.299) + (pVidStreamOld(j + 1) * 0.587) + (pVidStreamOld(j) * 0.114)
colorIndex = Math.Round((luminance * (nColors - 1) / 255))
pVidStreamNew(k) = CByte(colorIndex)
j = j + 3
k = k + 1
Next k
res = AVIStreamWrite(pVidStreamOut, i, 1, pVidStreamNew(0), biSizeImage8, AVIIF_KEYFRAME, 0, 0) 现在变成紫色了,上面有些其他色的杂点。图像和刚才一样。
我把avi的色彩值放到了一个byte型的数组中,用上面的循环将24位变成8位,需不需要“另外AVIStreamSetFormat函数只能在第一次调用的时候传入调色板信息,如果要修改调色板信息必须在写入若干帧数据以后才能再改”?
你所说的变色问题我也遇到过,而且每次生成的AVI是什么颜色还是不确定的,郁闷了我好一阵子。当时我错误理解了AVIStreamSetFormat,以为只需要传入BitmapInfoHeader,后来修正错误传入BitmapInfo结构就完全正常了
你所说的变色问题我也遇到过,而且每次生成的AVI是什么颜色还是不确定的,郁闷了我好一阵子。当时我错误理解了AVIStreamSetFormat,以为只需要传入BitmapInfoHeader,后来修正错误传入BitmapInfo结构就完全正常了
你知道正确的方法吗?请指教。
你有qq吗?很想和你探讨一下。谢谢!