'JPEG error #52' 错误,解决办法

主  题: 
大虾 'JPEG error #52' 错误,怎么办???
 
   
专家:
 老呆在从数据库中Image字段读出图像数据时出现如下错误提示:
Project mdiapp.exe raised exception class EJPEG with message 'JPEG 
error #52'. Process ...

程序是这样写的:
 TStream *pSt;
 TBlobField * pField;
 TJPEGImage *jpeg ;
 Query1->Open();
 TDBImage *p ;
  p=DBImage1;
 jpeg = new TJPEGImage();  
 pSt = Query1->CreateBlobStream(Query1->FieldByName("Image1"), bmRead);

 jpeg->LoadFromStream(pSt);     // 出错位置 

 p->Picture =NULL;
 p->Picture->Bitmap->Assign(jpeg);
 delete pSt;

请问这是什么原因?怎么解决?

另外:p->Picture 有Assign方法
      p->Picture->Bitmap有Assign方法
      p->Picture->GraphBitmap有Assign方法
      p->Picture->Graphic有Assign方法

      他们的区别是什么?分别在什么时候应用?  


 回复人: Wingsun(孙春阳) ( ) 信誉:100 2003-12-24 09:51:49Z 得分:30
 
 
?
p->Picture->Assign(jpeg);
就可以了。
出现这个错误应该是说你的jpeg数据流不对,也就是说从数据库中没有正确的获取到你需要的数据。
你可以先这样写:
jpeg->SaveToFile("C://temp.jpeg");
然后用一个图像查看的东西看看C:/Temp.jpeg是否是正确的图像文件。
还有就是有的Jpeg图象格式比较特殊,那就会使得TJPEGImage类无法正确识别数据。
还有你的错误不是发生在p->Picture->Bitmap->Assign(jpeg);的时候,而是发生在
jpeg->LoadFromStream(pStr)的时候。
所以应该先检查pStr是否正确获得了数据。
具体的如何从数据库中存取图像数据,你可以看看专题中的文章,或者查询一下以前的相关帖子。
LoadFromStream之前最好先将Stream的位置移动到Stream的头。
而且调用Stream的SaveToFile将其保存为文件,并查看其内容,保证数据是正确的。
Top
 
 回复人: zzhong2() ( ) 信誉:105 2003-12-24 10:06:39Z 得分:20
 
 
?
photo数据类型一定要是image 
存jpeg到SQL数据库:
if(OpenPictureDialog1->Execute())
  {
   ADOQuery1->Edit();
   TBlobField *Field = (TBlobField*)ADOQuery1->FieldByName("photo");
   Field->LoadFromFile(OpenPictureDialog1->FileName);
   ADOQuery1->Post();
  }

//以下是从数据库读jpeg
#include <clipbrd.hpp>

  TStream *Stream1;
  TJPEGImage   *Pjp;

  Pjp=new TJPEGImage();

  ADOQuery1->Open();
  try
  {
    Stream1=ADOQuery1->CreateBlobStream(ADOQuery1->FieldByName("photo"), bmRead);//photo是存放jpeg内容的字段,它的类型一定要用image
    Pjp->LoadFromStream(Stream1);
    //Image2是TDBImage组件,它的DateSource,和FieldName属性要空着
    Image2->Picture->Bitmap->Assign(Pjp);
    delete Stream1;
  }
  __finally
  {
   delete Pjp;
  }

二。别人的方法
支持多種格式
存:
if(OpenPictureDialog1->Execute())
  {DataSet->Edit();
   TBlobField *Field = (TBlobField*)DataSet->FieldByName("photo");
   Field->LoadFromFile(OpenPictureDialog1->FileName);
   DataSet->FieldByName("photoFormat")->AsString =
        ExtractFileExt(OpenPictureDialog1->FileName).UpperCase();
   DataSet->Post();
  }

读出:
以下是讀出各種類型的圖片的程序,支持ADO,BDE或TClientDataSet
#define PICTURE_MAP__(TBit) {TBit *PG = new TBit(); /
                             try {PG->LoadFromStream(TmpStream);/
                                  Pic->Assign(PG); /
                                 }/
                             catch(...)/
                               {delete PG ;/
                                return false;/
                               }/
                             delete PG;/
                             }
//----------------------------------------------------------------
//該模板將二進制字段中的圖像(GIF或JPG等等)使用Assign方法轉為TPicture,TBitmap等等。
template <class T >
bool LoadPhotoFromField(TField *F_Photo,const  AnsiString Format,T *Pic)
{if(!F_Photo->DataSet->Active) return false ;
 if(F_Photo->IsNull) return false ;
 else
  {TStream *TmpStream = F_Photo->DataSet->CreateBlobStream(F_Photo,bmRead);
   if(Format == ".JPG" || Format == ".JPEG")PICTURE_MAP__(TJPEGImage )
   else if(Format == ".BMP")                           PICTURE_MAP__(Graphics::TBitmap)
//   else if(Format == ".GIF")                      PICTURE_MAP__(TGIFImage )
   else if(Format == ".ICO")                      PICTURE_MAP__(TIcon)
   else if(Format == ".WMF" || Format ==".EMF")  PICTURE_MAP__(TMetafile)
   else   return false ;
  }
 return true;
}
#undef PICTURE_MAP__(TBit)
//如果要支持GIF,那你要安裝支持GIF的VCL類。





//下面是大白鲨的
记住一定要在post前delete TADOBlobStream对象。
//读
TBlobField * pField=(TBlobField *)pQuery->FieldByName("Image");
TADOBlobStream* pmem=new TADOBlobStream (pField,bmRead);
pmem->Seek(0,soFromBeginning);
Graphics::TBitmap * pBitmap=new Graphics::TBitmap();
pBitmap->LoadFromStream(pmem);
Image1->Picture->Assign(pBitmap);
delete pBitmap;
delete pmem;
//写
pQuery->Edit();
TBlobField * pField=(TBlobField *)pQuery->FieldByName("Image");
TADOBlobStream * pmem=new TADOBlobStream (pField,bmWrite);
pmem->Seek(0,soFromBeginning);
Graphics::TBitmap * pBitmap=new Graphics::TBitmap();
pBitmap->Assign(Image1->Picture->Graphic);
pBitmap->SaveToStream(pmem);
delete pBitmap;
delete pmem;
pQuery->Post();
Top
 
 回复人: goneaway1981(当我们踏上征程) ( ) 信誉:100 2003-12-25 09:34:52Z 得分:0
 
 
?
关注!!!
Top
 
 回复人: cker(〖烟波浩淼三千里、人鬼殊途五百年〗) ( ) 信誉:120 2003-12-25 23:48:14Z 得分:50
 
 
?
//  JPEG文件的头两个字节和末两个字节是特定的。
// 如果这四个字节校验错误说明jpeg文件不正确,导致JPEG Error 52。
// Avoid JPEG Error #52.
// Verify first two bytes of JPEG are $FFD8 (little endian $D8FF)
// Verify last two bytes of JPEG are $FFD9 (little endian $D9FF)

bool __fastcall JPEGISOK(TStream* jpegStream)
{
    WORD w1, w2;

    jpegStream->Seek(0, soFromBeginning); // use seek or position
    jpegStream->Read(&w1,2);

    jpegStream->Position = jpegStream->Size - 2;
    jpegStream->Read(&w2,2);

    return  (w1 == 0xD8FF) && (w2 == 0xD9FF);
}

// an useage.
void __fastcall TForm1::Button1Click(TObject *Sender)
{
    //OD is an openDialog.
    if(OD->Execute())
    {
       TFileStream* fs = new TFileStream(OD->FileName,fmOpenRead );
       try
       {
         if(JPEGISOK(fs))
           ShowMessage("OK");
         else
           ShowMessage("BAD");
       }
       __finally
       {
         delete fs;
       }
    }
}

Top
 
 回复人: lcdldd(老呆) ( ) 信誉:100 2003-12-28 15:57:15Z 得分:0
 
 
?
太棒了,不过请加上如下语句,以恢复初始位置,否则后面又有 其他的错误了

int pos= jpegStream->Position;
  //...
jpegStream->Position =pos ;
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值