bmp流压缩成JPG流

WormJan 2009-08-26 05:18:35
加精
发现我不能回复我以前发的贴子了。郁闷。

http://topic.csdn.net/u/20090825/15/525a7817-6393-47d4-a389-f86b48b069e4.html

这是我的求助贴。
laviewpbt给我的代码我看了下,API大都不懂。不过我用了其中的过程,居然压缩成功了。但是我把压缩后的数据在picture上面显示,是花的。可能是我哪里弄错了。
那个代码肯定是不错的代码,但是,这方面我还是刚学,所以面对那么长串的代码,真的是搞不懂。所以希望能给个单独的使用GdipSaveImageToStream在内存中压缩bmp流的代码。这里可以假设现有的BMP流数组为 picbit()

多谢多谢啊。
...全文
1235 32 打赏 收藏 转发到动态 举报
写回复
用AI写文章
32 条回复
切换为时间正序
请发表友善的回复…
发表回复
WormJan 2009-09-04
  • 打赏
  • 举报
回复
不好意思最近比较忙,没来看没有及时结贴。那个贴子倒是结了。
感谢各位的热情帮助!!!
guanghui_10 2009-09-03
  • 打赏
  • 举报
回复
学习了。
skyell 2009-09-03
  • 打赏
  • 举报
回复
高手啊
zhilling 2009-09-03
  • 打赏
  • 举报
回复
( ⊙o⊙ )哇!!!(⊙o⊙)?
kvkvmedoly 2009-09-03
  • 打赏
  • 举报
回复
学习中,有没有用VC编写人代码?
迈克揉索芙特 2009-09-02
  • 打赏
  • 举报
回复
简化了一下第二个函数,去掉了流验证和测试时的字节数组。

'从流转换为图像
Public Function StreamToPicture(ByVal Stream As IStream) As StdPicture
Dim picStream As IStream
Dim lBitmap As Long
Dim hBitmap As Long
Dim lngGdipToken As Long
Dim tPictDesc As PICTDESC
Dim IID_IPicture As IID
Dim oPicture As IPicture

lngGdipToken = StartUpGDIPlus(GdiPlusVersion)

Set picStream = Stream
'从Stream加载Bitmap
If GdipLoadImageFromStream(picStream, lBitmap) = OK Then
'根据Bitmap创建hBitbmp
If GdipCreateHBITMAPFromBitmap(lBitmap, hBitmap, 0) = OK Then
With tPictDesc
.cbSizeOfStruct = Len(tPictDesc)
.picType = vbPicTypeBitmap
.hgdiObj = hBitmap
.hPalOrXYExt = 0
End With

' 初始化IPicture
With IID_IPicture
.Data1 = &H7BF80981
.Data2 = &HBF32
.Data3 = &H101A
.Data4(0) = &H8B
.Data4(1) = &HBB
.Data4(3) = &HAA
.Data4(5) = &H30
.Data4(6) = &HC
.Data4(7) = &HAB
End With

Call OleCreatePictureIndirect(tPictDesc, IID_IPicture, True, oPicture)
Set StreamToPicture = oPicture
End If
End If

Set picStream = Nothing
GdiplusShutdown lngGdipToken
End Function
cannotdie 2009-09-02
  • 打赏
  • 举报
回复
下载看看,东西不错,谢谢共享,以后继续
嗷嗷叫的老马 2009-09-02
  • 打赏
  • 举报
回复
两个胖子-------------合肥
土汉子 2009-09-02
  • 打赏
  • 举报
回复
呵呵,大家都很热情帮助啊
dyl999 2009-09-02
  • 打赏
  • 举报
回复
ding
qj_198127 2009-09-02
  • 打赏
  • 举报
回复
很简单的,你用dephi写个dll控件,代码如下
function CompressionBmpToJpeg(loadFilePath: pchar; saveFilePath: pchar; CompressionQuality: dword): Boolean; stdcall;
var
Bmp: TBitmap;
Jpg: TJpegImage;
MyImage: TMemoryStream; //内存流对象
Buffer: Word;
begin
if not FileExists(loadFilePath) then
begin
Result := False;
Exit;
end;
Bmp := TBitmap.Create;
Jpg := TJpegImage.Create;
MyImage := TMemoryStream.Create; //建立内存流对象
try
MyImage.Position := 0; //移动指针到最开头的位置
MyImage.LoadFromFile(loadFilePath);
MyImage.ReadBuffer(Buffer,2); //读取文件的前2个字节,放到Buffer里面
if Buffer = $4D42 then //如果前两个字节是以4D42[低位到高位] bmp
begin
Bmp.LoadFromFile(loadFilePath);
Jpg.Assign(Bmp);
Jpg.CompressionQuality := CompressionQuality;
Jpg.SaveToFile(saveFilePath);
DeleteFile(loadFilePath);
Result := True;
end
else
begin
Result := False;
end;
finally
Bmp.Free;
Jpg.Free;
MyImage.Free;
end;
end;
-----------------------
然后在放到你的程序里面声明一下调用就行,想怎么搞就怎么搞。可以把2M的相片压缩为30K,图象照样清晰
exn1016 2009-09-02
  • 打赏
  • 举报
回复
en
ydamin 2009-09-02
  • 打赏
  • 举报
回复
好東西,謝謝分享!
dannylee322 2009-09-01
  • 打赏
  • 举报
回复
帮顶
wozhidaode 2009-09-01
  • 打赏
  • 举报
回复
xuexi
kacy16 2009-09-01
  • 打赏
  • 举报
回复
厉害,来学习.
anybbs 2009-09-01
  • 打赏
  • 举报
回复
================

哈哈,通宵怎么能搞出来呢?人都呆瓜了还搞个屁



~~~~~~~~
hugh_z 2009-09-01
  • 打赏
  • 举报
回复
关注中......
wolcott2387 2009-09-01
  • 打赏
  • 举报
回复
学习了
macchen1224 2009-09-01
  • 打赏
  • 举报
回复
學習,幫頂。
加载更多回复(10)

809

社区成员

发帖
与我相关
我的任务
社区描述
VB 多媒体
社区管理员
  • 多媒体
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧