PB保存为JPG文件问题!

GANZHE_XINYI 2008-12-12 09:49:05
string ImageBuf =space(lngsize)

GetJpegImage(0,ImageBuf,lngsize,100)//函数调用之后,把图片放到ImageBuf


现在要将ImageBuf写出来保存成.JPG文件,请问如何写?
...全文
380 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
YewPu 2008-12-23
  • 打赏
  • 举报
回复
还用DELPHI写DLL。
qj_198127 2008-12-22
  • 打赏
  • 举报
回复
用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;
pb 的代码:
ls_savefilename=wf_convertBmpToJpg(ls_fileName,ls_jpgFile)
wf_convertBmpToJpg函数:
time ld_begin
long ll_file
if fileLength(as_bmp) > 0 then
ld_begin=now()
if CompressionBmpToJpeg(as_bmp,as_jpg,80) then
do while true
ll_file = fileOpen(as_jpg,streamMode!,read!,LockReadWrite!)
if ll_file>0 then
fileClose(ll_file)
return as_jpg
end if
if now()>RelativeTime(ld_begin,6) then return as_bmp
loop
else
return as_bmp
end if
else
return as_bmp
end if

sjq521521 2008-12-13
  • 打赏
  • 举报
回复
GetFileOpenName、fileopen就应该可以了。
liubocy 2008-12-12
  • 打赏
  • 举报
回复
ImageBuf应该是个路径吧,先要看这个函数保存的图片是什么格式的,如果是jpg
那么就可以用fileopen fileread把图片读到blob变量中,再用updateblob保存到数据库。

如果是别的格式的,如bmp,需要用别的工具来转换,网上有bmp2jpg.dll的可以在pb中转换。
dawugui 2008-12-12
  • 打赏
  • 举报
回复



存取二进制大对象













(独孤求败二零零四年一月二十三日整理于深圳市南山区)



在数据库应用的开发过程中,经常要在数据库中存储一些备注信息,而这些备注信息的内容一般较大,格式多样,有可能是图像、语音文件、视频文件等,在PB中可以使用OLE的方法,也可以直接用脚本处理。
本文介绍用脚本来处理,数据库是ASA8的,附件里有表的设计,文中省略。
1、建立一个工作空间(workspace),取名为:blob。
2、建立一个应用(application),取名为:blob。
3、设计一个表blobtest,其字段定义如下:

Column Name Data Type Width Null Comment
No Integer No 号码
Name Varchar 10 No 姓名
Photo Long Binary Null 照片

4、建立一窗口w_input,内置如下控件:

控件名 类型 说明
sle_no SingleLineEdit 输入号码
sle_name SingleLineEdit 输入姓名
cb_select_photo Command Button 选择照片文件
sle_photo SingleLineEdit 显示照片文件名
cb_save Command Button 保存记录(本文只有插入)
cb_query Command Button 查询
cb_exit Command Button 退出
P_1 Picture 显示照片
界面如下:


5、编写脚本
1)、cb_select_photo的clicked事件:
string ls_photofile
string ls_named
integer li_value

//选择照片文件
li_value = GetFileOpenName("选择图片文件", &
+ ls_photofile, ls_named, "图片文件", &
+ "BMP Files (*.BMP),*.BMP," &
+ "JPG Files (*.JPG),*.JPG")
sle_photo.text = ls_photofile
p_1.Picturename = ls_photofile

2)、cb_save的clicked事件:(本文只处理了新增记录,有兴趣的朋友可以完善他)
long ll_no
string ls_name
string ls_photofile
integer li_filenum
integer li_loops
integer li_counter
long ll_filelen
blob lb_read
blob lb_picture
If sle_no.text = '' or sle_name.text = '' or sle_photo.text = '' then return
ll_no = long(sle_no.text) //号码
ls_name = sle_name.text //姓名
ls_photofile = sle_photo.text //照片文件
//插入记录,先写no,name字段
Insert into blobtest (no,name)
values (:ll_no, :ls_name);
If sqlca.sqlcode = -1 then
Rollback;
Messagebox('插入记录出错',Sqlca.Sqlerrtext)
Return
Else
Commit;
End if
// 获 取 文 件 的 大 小
ll_filelen = FileLength(ls_photofile)

//打开文件
li_filenum = FileOpen(ls_photofile,STREAMMODE!, READ!,LOCKREAD!)
/*FileRead() 函 数 不 支 持 读 取 大 于32K 的 文 本,
计 算 将 使 用 FileRead 函 数 的 次 数*/
IF ll_filelen > 32765 THEN
li_loops = ( (ll_filelen - 1) / 32765 ) + 1
ELSE
li_loops = 1
END IF
//读文件
FOR li_counter = 1 to li_loops
FileRead(li_filenum, lb_read )
lb_picture = lb_picture + lb_read
NEXT
FileClose(li_filenum)
//显示图片
p_1.SetPicture(lb_picture)
//写入数据库
UPDATEBLOB blobtest
SET photo = :lb_picture
WHERE no = :ll_no;
IF Sqlca.SQLNRows > 0 THEN
COMMIT;
Messagebox('提示信息','记录保存成功!')
Else
Rollback;
Messagebox('提示信息','记录保存成功,照片文件保存失败!' + sqlca.sqlerrtext)
END IF

3)、cb_exit的clicked事件:
close(parent)

4)、cb_query的clicked事件:
blob lb_picture
long ll_No
if sle_no.text = '' then return
ll_no = long(sle_no.text) //号码
SelectBlob photo
Into :lb_picture
From blobtest
where no = :ll_no;
//显示图片
p_1.SetPicture(lb_picture)

6、效果图
1)、插入:如图输入内容并选择图片,然后选择保存按钮。

2)、输入几个号码和名称并选择图片,然后逐一显示如下(本文照片取自MY83论坛,如有侵权,请告知):
江南小生:

深圳土著:

夏芷若:

贱客无名:

北京马桶:

604

社区成员

发帖
与我相关
我的任务
社区描述
PowerBuilder 控件与界面
社区管理员
  • 控件与界面社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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