请问一个jpeg图像在数据库中的存储问题!

domustdo 2003-04-23 11:23:37
我想往SQL Server数据库中写入jpeg格式的图像,并在DBImage中显示,不知道有没有方法可以直接从jpeg文件写入,好像都要借助于bitmap来转换?我的代码如下,编译能通过,但是运行选择jpeg图片,存储时报错:Bitmap Image is not valid。
请问各位大虾有没有什么解决办法,最好是能从jpeg直接写入?

//将bitmap图片以jpeg格式存储到SQL Server中
std::auto_ptr<Graphics::TBitmap> bitmap(new Graphics::TBitmap);
bitmap->LoadFromFile(Edit1->Text); //指定选择的bitmap图片

std::auto_ptr<TJPEGImage> jpeg(new TJPEGImage);
jpeg->Assign(bitmap.get());

std::auto_ptr<TMemoryStream> stream (new TMemoryStream);
jpeg->SaveToStream(stream.get());
stream->Position = 0;

ADOTable1->Open();
ADOTable1->Append();
ADOTable1->FieldByName("PicName")->Value = str; //str为图片的名字
((TBlobField *)ADOTable1->FieldByName("Picture"))->LoadFromStream(stream.get());
ADOTable1->Post();
...全文
67 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
wsljj_2002 2003-04-30
  • 打赏
  • 举报
回复
我做过存入oracle的,不知道和sql server一样不。如果一样的话你搜索一下能找到的。如果不一样,看一下这个。http://expert.csdn.net/Expert/topic/587/587362.xml?temp=.9113581
短歌如风 2003-04-24
  • 打赏
  • 举报
回复
很久以前为Delphi处理过这个问题,不过在BCB中要复杂一些:

把这个单元加入到你一个工程:
$(BCB)\Source\VCL\Graphics.pas
找到TPicture.LoadFromStream和SaveToStream,改为:
procedure TPicture.LoadFromStream(Stream: TStream);
begin
ReadData(Stream);
end;

procedure TPicture.SaveToStream(Stream: TStream);
begin
WriteData(Stream);
end;
并把它们改为Public函数。

由于是pas文件,可能需要你有一些Object Pascal的知识。

修改$(BCB)\include\Graphic.hpp
把SaveToStream和LoadFromStream改为公共函数

然后修改改你的代码:

std::auto_ptr<TMemoryStream> stream (new TMemoryStream);
jpeg->SaveToStream(stream.get());
stream->Position = 0;

改为:
std::auto_ptr<TMemoryStream> stream (new TMemoryStream);
std::auto_ptr<TPicture> Pic (new TPicture);
Pic -> Graphic = jpeg;
Pic -> SaveToStream(stream.get());
...
读取时:
std::auto_ptr<TPicture> Pic (new TPicture);
Pic -> LoadFromStream(stream.get());
...

注意:一定要在Project|Options的Packages页中把“Build with runtime packages”选项去掉,否则你的修改不起作用。
如果还不行,就把你编译生成的Graphics.dcu复制到$(BCB)\lib和$(BCB)\lib\debug目录去。
我已经试过了,用如下代码可以正常显示:

auto_ptr<TJPEGImage> Jpeg(new TJPEGImage);
auto_ptr<TPicture> Pic(new TPicture);
Jpeg->LoadFromFile("G:\\filejpg.jpeg");
Pic ->Graphic = Jpeg.get();
auto_ptr<TStream> Strm(new TMemoryStream);
Pic->SaveToStream(Strm.get());
auto_ptr<TPicture>Pic2(new TPicture);
Strm->Position = 0;
Pic2->LoadFromStream(Strm.get());
Image1->Picture->Graphic = Pic2->Graphic;

短歌如风 2003-04-24
  • 打赏
  • 举报
回复
我上面做的就是这件事啊!
在保存时不只保存图像信息,同时把TGraphic类的类名保存进去。读取时先读出类名,根据类名创建正确的TGraphic。由于要用到Graphics单元的静态变量(FileFormats),所以只能修改Graphics单元来实现。以前我在Delphi中解决时是自己写代码调用FileFormats完成从类名到TGraphic类的轮换的,后来我发现TPicture::WriteData和TPicture::ReadData和我写的代码一样,就改成这样实现了。
注意我后面写的例子中,读取的代码共三行:
Strm->Position = 0;
Pic2->LoadFromStream(Strm.get());
Image1->Picture->Graphic = Pic2->Graphic;
并没有使用TJPEGImage,但它还是正确读出来了。
domustdo 2003-04-24
  • 打赏
  • 举报
回复
非常感谢plainsong(伤心的风),我已经解决了把jpeg格式文件直接录入sql server的问题,代码如下:
void __fastcall TForm1::Button1Click(TObject *Sender)
{
Edit1->Text = FileListBox1->Items->Strings[FileListBox1->ItemIndex];

std::auto_ptr<TMemoryStream> stream (new TMemoryStream);
stream->LoadFromFile(Edit1->Text);
stream->Position = 0;

String sqlstr;
sqlstr = "insert into pic_table (PicName, Picture)";
sqlstr += "values (:PicName, :Picture)";

ADOQuery1->Close();
ADOQuery1->SQL->Clear();
ADOQuery1->SQL->Add(sqlstr);
ADOQuery1->Parameters->Items[0]->Value = Edit1->Text;
ADOQuery1->Parameters->Items[1]->LoadFromStream(stream.get(), ftBlob);
ADOQuery1->ExecSQL();
}

不过,我发现当我用DBImage来显示的时候就会出错:Bitmap image is not valid,好像是DBImage只是支持Bitmap格式的文件,我记得在TImage中显示jpeg图像的方法如下:
#include <jpeg.hpp>
void __fastcall TForm1::Button1Click(TObject *Sender)
{
std::auto_ptr<TJPEGImage> JImage (new TJPEGImage);
JImage->LoadFromFile("mm.jpg");

Image1->Width = JImage->Width;
Image1->Height = JImage->Height;
Image1->Picture->Assign(JImage.get());
}

但是该如何在DBImage中显示jpeg格式的图片呢?Image是可以经过Assign方法来控制转换,那么怎么控制DBImage从数据库中读入jpeg格式图片时的显示呢?

13,825

社区成员

发帖
与我相关
我的任务
社区描述
C++ Builder相关内容讨论区
社区管理员
  • 基础类社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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