我爱builder

C++Builder 程序员博客

为什么我用BCB在mysql里存的图片不能大于10K以上,很奇怪!

我的代码

C/C++ code
QueryProSave->Close(); QueryProSave->SQL->Clear(); AnsiString sSql; sSql = "UPDATE product SET f16=:v16 WHERE f1="+sId; } QueryProSave->SQL->Text = sSql; QueryProSave->Prepared = true; QueryProSave->Params->ParamByName("v16")->LoadFromFile(PImage1,ftBlob);//PImage1图片路径 QueryProSave->Execute();

高手解答

图片为什么要存在数据库里呢?存在文件夹里多好,然后在数据库里放这个图片的index

MySQL本身有对提交BLOB字段的大小的设置,修改之,你要传多大都可以,无法就是多花一点时间的问题。

MySQL 需要地服务器设置BLOB字段大小

看视字段设的不够.

引用 2 楼 zhangwuji155 的回复:
图片为什么要存在数据库里呢?存在文件夹里多好,然后在数据库里放这个图片的index

这个是好办法

引用 2 楼 zhangwuji155 的回复:
图片为什么要存在数据库里呢?存在文件夹里多好,然后在数据库里放这个图片的index

这个是好办法

sql server 里面好象没有这个问题,1MB的图片都可以存储

  • Filed under: C++ Builder
  • 我想把数据流和图片存放到MSSQL中,不知道如何实现
    控件我用的是ADOQUERY,最好是通过SQL语句的INSERT 和 UPDATE来操作,这样比较方便通用一点

    我现在的思路是:
    一/把文件读出来后存到数据库中
      这一步我没有试过,但感觉有点麻烦,图片里的数据估计会包含\0所以用语句好象没办法解决。
      这个可以用TEXT类型字段吧

    二/把图片里的数据进行Image1->Picture->Bitmap->SaveToStream(Buffer)操作在存入数据库
      这一步我不知道如何把Buffer存放数据库中
      这个应该是用IMAGE字段吧

    不知道大家有没有什么更好的办法,或是能帮我解决这二个办法中的一个怎么做也好

    谢了各位大吓们。

    或者数据库中存放图片的路径,图片存在在硬盘的目录中

    二楼的方法是现在大多人所接受的.那样速度快效率高.

    建一个图片目录,还是把PACH TO Save DATABASE 比较好.

      其实各有利弊的。

    C/C++ code
    //选择一张图片上传到数据库 已测试 void __fastcall TForm1::Button2Click(TObject *Sender) { if(OpenPictureDialog1->Execute()) { //String strSql = "insert into T_VERTYPEIMAGE (VerTypeNo,ImagePosKeyName,ImageBin) VALUES(’%s’,'%s’,)"; String strSql = "INSERT INTO T_VERTYPEIMAGE (ImageBin)"; strSql = strSql + " VALUES(:picture)"; try{ ADOQuery1->Close(); ADOQuery1->SQL->Clear(); ADOQuery1->SQL->Add(strSql); ADOQuery1->Parameters->ParamByName("picture")->LoadFromFile(OpenPictureDialog1->FileName, ftBlob); ADOQuery1->ExecSQL(); } catch(…) { return; } } } }

    C/C++ code
    //用流的方式存取图片 ADOTable1->Active=true; TMemoryStream *stream = new TMemoryStream(); if(OpenPictureDialog1->Execute()==false) return; AnsiString aa=OpenPictureDialog1->FileName; stream->LoadFromFile(aa); //Image1->Picture->Bitmap->SaveToStream(stream); //Image1->Picture->LoadFromFile(aa); ADOTable1->Insert(); ((TGraphicField *)(ADOTable1->FieldByName("ImageBin")))->LoadFromStream(stream); ADOTable1->Post(); delete stream;

    ADOQuery1->Close();
    ADOQuery1->SQL->Clear();
    ADOQuery1->SQL->Add("select * from T_VERTYPEIMAGE where system=0");

    ADOQuery1->FieldByName("ImageBin")->SaveToFile("abcd.bmp");这样读取为什么老提示没有这个功能,如果没有的话如何存放为我指定的文件呢?

    ADOQuery1->Close();

    ImageBin这个是数据库的字段名

    解决了,谢谢  HNZLK  过二天就结贴

    C/C++ code
    TStream *Stream1; //TJPEGImage *Pjp; Graphics::TBitmap * pBitmap1=new Graphics::TBitmap(); // Pjp=new TJPEGImage(); ADOQuery1->Open(); try { Stream1=ADOQuery1->CreateBlobStream(ADOQuery1->FieldByName("ImageBin"), bmRead); pBitmap1->LoadFromStream(Stream1);//如果是TDBImage组件,它的DateSource,和FieldName属性要空着 Image1->Picture->Bitmap->Assign(pBitmap1); delete Stream1; delete pBitmap1; } __finally { ADOQuery1->Close(); //delete Pjp; }

    不懂,up

  • Filed under: C++ Builder
  • Table4->Active = true;
    Graphics::TBitmap  *tmpBmp  =  new  Graphics::TBitmap();
      tmpBmp->LoadFromFile(OpenDialog1->FileName);
      Table4->Append();
      Table4->FieldByName("图形")->Assign(tmpBmp);
      Table4->Post();
      delete  tmpBmp;
      Table3->Active=false;
    我用这段代码向paradox的数据库表里面存入一个bmp的图片,提示错误是表中的另一个字段must have a value 不过我的那个字段之前就已经给了一个字符值。
    Table3->Active = true;
    Table3->Append();
    Table3->FieldByName("类型")->Value="图1";
    Table3->Post();
    这是什么原因????

    C/C++ code
    Table1->DatabaseName = "D:\\Program Files\\BCB\\Borland Shared\\Database Desktop\\WorkDir\\"; Table1->TableName ="demo.db"; Table1->Active =true; Table1->Append(); Table1->FieldByName("序号")->Value = 1; ((TBlobField*)Table1->FieldByName("图形"))->LoadFromFile("C:\\3.bmp"); Table1->Post() ; //图形字段用OLE类型的 也就是ftParadoxOle

     

    C/C++ code
    //取出图片 Table1->DatabaseName = "D:\\Program Files\\BCB\\Borland Shared\\Database Desktop\\WorkDir\\"; Table1->TableName ="demo.db"; Table1->Active =true; Table1->First(); TStream* pStream=Table1->CreateBlobStream(Table1->FieldByName("图形"),bmRead); Image1->Picture->Bitmap->LoadFromStream(pStream); delete pStream;

  • Filed under: C++ Builder
  • 请问各位高手,我怎么实现n张图像的动态显示,实现图象的循环和动态显示方式的循环,我的程序循环显示总有点问题,谁有好方法??给予指教

    具体问题看代码了,   可以用Timer实现动态显示

    定义播放函数,动态滚动显示
      switch   (flag)
                    {
                                  case   0:   //   detrusion   from   down

                                  if(x <tmpImagePanel-> Height)
                                  {
                                          Bit1-> Canvas-> CopyRect(Rect(0,height-x,width,height),
                                                                    Bit1-> Canvas,Rect(0,0,width,x));
                                          x+=2;
                                          //———–
                                  }
                                  else
                                          ChangePic=true;
                                          break;
                              case   1:
                                      break;
                       
                  }
    定义Timer事件函数
    Private:
              TStringList   PicList;
    void   __fastcall   TForm1::Timer1Timer(TObject   *Sender)
    {
     
                    if(ChangePic)
                  {
                            do
                            {
                                        flag   =   (flag+1)%8;
                            }
                            while(!Effect[flag]);

                          //   for(int   i=0;i <8;i++)
                          //   {
                          //             flag   =   (i+1)%8   ;
                        //               if(i==8)
                        //                   break;
                        //   }

                            Pic   =   (Pic+1)%PicList-> Count   ;
                            LoadPic(PicList-> Strings[Pic]);
                            ChangePic=false;
                            x=0;
                          //   if(flag   ==7)
                            //             ZeroMemory(b,sizeof(b));
                  }
                  PlayPic();        

    }

    急,怎还没有人回答呢??高手呢????

  • Filed under: C++ Builder
  • bmp格式的可以导入image控件再取相应像素点的值,但其它格式有什么办法.还有GIF动画怎么截取每一帧.?

    还有GIF动画怎么截取每一帧.?
    —————————–
    用PHOTOSHOP的ImageReady程序的导出功能可把GIF的每一帧产生出JPG一批,
    我常用它分解每一帧

    引用 2 楼 yhec 的回复:
    还有GIF动画怎么截取每一帧.?
    —————————–
    用PHOTOSHOP的ImageReady程序的导出功能可把GIF的每一帧产生出JPG一批,
    我常用它分解每一帧
      这是个办法。但是我是想在自己的软件中直接转换和读取。

    这不会有简单的方法,BCB6以下版本都不支持GIF,除非用第三方的

    MARK

    可以用CxImage或GDI Plus载入GIF文件其中的某一帧。
    CxImage载入多帧文件的方法:

    C/C++ code
    CxImage img; img.SetFrame(1); // 载入第二帧(0是第一帧) img.Load("abc.gif",CXIMAGE_FORMAT_GIF); //载入文件 if(img.IsValid()) { ShowMessage( "图片帧数:" + IntToStr(img.GetNumFrames())); RGBQUAD clr = img.GetPixelColor(10,10); // 取10,10上的颜色值 /*RGBQUAD定义: typedef struct tagRGBQUAD { BYTE rgbBlue; BYTE rgbGreen; BYTE rgbRed; BYTE rgbReserved; } RGBQUAD; */ }

    另,bmp也不需要导入image控件再取相应像素点的值,直接用ScanLine或Bmp->Canvas->Pixels取就可以了

    引用 6 楼 Waiting4you 的回复:
    可以用CxImage或GDI Plus载入GIF文件其中的某一帧。
    CxImage载入多帧文件的方法:

    C/C++ codeCxImage img;
    img.SetFrame(1);  // 载入第二帧(0是第一帧)
    img.Load("abc.gif",CXIMAGE_FORMAT_GIF); //载入文件
    if(img.IsValid())
    {
        ShowMessage( "图片帧数:" + IntToStr(img.GetNumFrames()));
       
        RGBQUAD clr = img.GetPixelColor(10,10);  // 取10,10上的颜色值
        /*RGBQUAD定义:
        typedef str…

    谢谢.我试试..

  • Filed under: C++ Builder
  • 在BCB下如何实现图片拼接的问题:
    1.假设一个20*20的正方形方格图片,用程序将其几个一样的方格拼接成俄罗斯方块图片。
    2.拼接后的图片能够像一个图一样及整体操作。可以鼠标拖动的。
    希望各位高手给点思路。要是有代码参考甚好。谢谢!!!!!。

    帮忙顶一下,让了解的人来解答.

    给个思路吧,代码自己写
    假设你要把2个2*2的正方形拼成长方形,那就首先声名一个2*4的画布。再用copyrect函数把正方形1,2分别按坐标重绘到画布上。把这个画布生成图片,在图的mousedown事件里设计鼠标按着拖动的代码。

    我想的是拼接后的图片是不规则的,只显示不规则的图片,不要那些画布上的白色区域。
    在画布上拼接好一个不规则图片后,总有白色区域,拖动它的时候还是一个矩形。我想拖动时就是不规则的图片。不需要白色区域。怎么办呢?

    俄罗斯方块的图形,都是些小正方形组成的。你定义相对尺寸的矩阵画布,把空白部分填成背景颜色。

    因为我要处理图片边界问题,需要用到坐标来定位。比如2个不规则的俄罗斯方块,只能对角接触,不能挨边接触。这样就要使用坐标了,可是我每个图都是不一样的,这样定位坐标那不得挨个定位吗?不知道讲清楚了没有。

    俄罗斯方块如果以一个小图为基准,其它3块相对于基准方块有8个位置,设一结构里面有四个图片指针和三个标记,标记记录了每个图片对应基准图的位置,用一个函数处理基准图移动,同时其它图根据标记和基准图最终位置算出绝对坐标,在整块移动时,调用这个函数。做成class更好

    引用 7 楼 fieldisme 的回复:
    俄罗斯方块如果以一个小图为基准,其它3块相对于基准方块有8个位置,设一结构里面有四个图片指针和三个标记,标记记录了每个图片对应基准图的位置,用一个函数处理基准图移动,同时其它图根据标记和基准图最终位置算出绝对坐标,在整块移动时,调用这个函数。做成class更好

        能给那个结构的代码吗?谢谢哦

    只是有这个思路,以前做过,找不到代码了

    只要那个结构的代码,“设一结构里面有四个图片指针和三个标记”。就这个结构。可以吗?我想要是那个俄罗斯方块是5个小方格组成也是这样的思路吧!

  • Filed under: C++ Builder
  • 如何将一个图片切割成等高度,等宽度的10张图片,再将这10张图片按不同比例缩放,再拼接在一起,成功就送分!

    帮顶一个

    图像伸缩部分没有问题了吧?
    切割部分,用copyrect,给点提示
    Graphics::TBitmap *Map = new Graphics::TBitmap();
    Map->Width=64;
    Map->Height=16;
    Map->Canvas->CopyRect(TRect(0,0,32,16),bufMapA->Canvas,TRect(0,0,32,16));
    Map->Canvas->CopyRect(TRect(32,0,64,16),bufMapB->Canvas,TRect(0,0,32,16));
    以上代码表达的是。bufMapA和bufMapB是两个32*16的图片,定义了一个64*16的画板为Map,代码实现的功能是把A和B拼接到Map上。其实这个是拼接,至于切割,是同理的。你需要在你的算法里体现好TRect(0,0,32,16)这样的坐标就可以了。TRect里的参数为(left; top; right; bottom; )

    学习一下

  • Filed under: C++ Builder
  • 这是我的代码,
    void __fastcall TForm1::Button1Click(TObject *Sender)
    {
    double ratio,ImgWidth,ImgHeight;
    ratio = StrToFloat(Edit1->Text); //图像缩放比率
    ImgWidth = Image1->Picture->Width;//原图的宽度
    ImgHeight = Image1->Picture->Height;//原图的高度

    Graphics::TBitmap  *newbmp=new  Graphics::TBitmap();
    newbmp->Width =Image1->Picture->Width ;
    newbmp->Height =Image1->Picture->Height ;
    int iOldMode=SetStretchBltMode(newbmp->Canvas->Handle,COLORONCOLOR);//防止颜色失真
    StretchBlt(newbmp->Canvas->Handle,0,0,(newbmp->Width)*ratio,(newbmp->Height)*ratio,
    Image1->Canvas->Handle,0,0,ImgHeight,ImgWidth,SRCCOPY);
    SetStretchBltMode(newbmp->Canvas->Handle, iOldMode);

    if(SavePictureDialog1->Execute()); //保存修改后的图像
    newbmp->SaveToFile(SavePictureDialog1->FileName);

    Image1->Picture->Assign(newbmp);
    delete newbmp;
    }
    怎么缩放后的图片显示不全,就是右边有部分没显示?

    已经设为true 了啊,不信你试试看

    用CopyRect來處理試一下 我測了似乎沒有問題

    Graphics::TBitmap *Bitmap;

    TRect  MyRect, MyOther;

    MyRect = Rect(10,10,100,100);    //老圖片的left top right bottom

    MyOther = Rect(10,111,300, 501);    //新圖片的left top right bottom   
    Bitmap = new Graphics::TBitmap;
    Bitmap->LoadFromFile("C:\\1.bmp");   
    Form1->Canvas->BrushCopy(MyRect, Bitmap, MyRect, clBlack);
    Form1->Canvas->CopyRect(MyOther, Bitmap->Canvas, MyRect);
    delete Bitmap;

    C/C++ code
    //给你代码修改并注释了点 Graphics::TBitmap *newbmp=new Graphics::TBitmap(); newbmp->Width =Image1->Picture->Width*ratio ;//定义的画板大小比例你没设置 newbmp->Height =Image1->Picture->Height*ratio ; int iOldMode=SetStretchBltMode(newbmp->Canvas->Handle,COLORONCOLOR);//防止颜色失真 StretchBlt(newbmp->Canvas->Handle,0,0,(newbmp->Width),(newbmp->Height)*ratio, //所以这里的比例就不需要设置了 Image1->Canvas->Handle,0,0,ImgHeight,ImgWidth,SRCCOPY); SetStretchBltMode(newbmp->Canvas->Handle, iOldMode);

    有没有那位做过,请指教啊,我这种方法怎么不行?

    你的代码思路是对的,逻辑上有点小误差,没有关系的。

    http://expert.csdn.net/expert/topic/1084/1084944.xml?temp=.6113245 
      http://expert.csdn.net/expert/topic/1082/1082598.xml?temp=.4414942 
      http://expert.csdn.net/expert/topic/1086/1086859.xml?temp=.168194 
    这里有你想要滴~~

    引用 4 楼 yumikoo 的回复:
    C/C++ code//给你代码修改并注释了点Graphics::TBitmap*newbmp=newGraphics::TBitmap();
    newbmp->Width=Image1->Picture->Width*ratio ;//定义的画板大小比例你没设置newbmp->Height=Image1->Picture->Height*ratio ;intiOldMode=SetStretchBltMode(newbmp->Canvas->Handle,COLORONCOLOR);//防止颜色失真StretchBlt(newbmp->Canvas->Handle,0,0,(newbmp->Width),(newbmp->Height)*ratio,//所以这里的比例就不需要设置了Image1->…

    我试过一样的效果

    晕,我试了是可以的。

    SORRY,我把我的代码拷进来拷错了
    再贴下
    void __fastcall TForm1::Button1Click(TObject *Sender)
    {
        double ratio,ImgWidth,ImgHeight;
        ratio = StrToFloat(Edit1->Text); //图像缩放比率
        ImgWidth = Image1->Picture->Width;//原图的宽度
        ImgHeight = Image1->Picture->Height;//原图的高度

        Graphics::TBitmap  *newbmp=new  Graphics::TBitmap();
        newbmp->Width =Image1->Picture->Width*ratio/100 ;//我的edit里面是输入的整数,比如80,代表80%所以我除以了100
        newbmp->Height =Image1->Picture->Height*ratio/100 ;
        int iOldMode=SetStretchBltMode(newbmp->Canvas->Handle,COLORONCOLOR);//防止颜色失真
        StretchBlt(newbmp->Canvas->Handle,0,0,(newbmp->Width),(newbmp->Height),//这里不对宽高进行赋值
        Image1->Canvas->Handle,0,0,ImgHeight,ImgWidth,SRCCOPY);
        SetStretchBltMode(newbmp->Canvas->Handle, iOldMode);

        if(SavePictureDialog1->Execute()); //保存修改后的图像
        newbmp->SaveToFile(SavePictureDialog1->FileName);

        //Image1->Picture->Assign(newbmp);
        delete newbmp;
    }

    解决了,换了一各方法:
    float  zoomfactor1=0.5;
          //Image1->AutoSize=false;
          Graphics::TBitmap  *TmpBmp=new  Graphics::TBitmap(); 
          TmpBmp->Width=Image1->Picture->Bitmap->Width*zoomfactor1; 
          TmpBmp->Height=Image1->Picture->Bitmap->Height*zoomfactor1; 
     
          for(int  i=0;  i <TmpBmp->Width;  i++) 
            for(int  j=0;  j <TmpBmp->Height;  j++) 
              TmpBmp->Canvas->Pixels[i][j]  = 
                  Image1->Picture->Bitmap->Canvas->Pixels[i/zoomfactor1][j/zoomfactor1]; 
              Image1->Width=TmpBmp->Width;//***** 
              Image1->Height=TmpBmp->Height;//***** 
              Image1->Picture->Bitmap->Assign(TmpBmp); 
              delete  TmpBmp; 

  • Filed under: C++ Builder
  • 例如:如何把一张JPEG格式图片(A4纸大小)切割成10*10个小图片,然后把各个小图片缩小成原来的90%,(有可能每个小图片缩小比例不一样),然后再将各个小图片重新组合起来,谢谢!

    1,整个图片定义一个CANVES,为Map
    2,Canvas->CopyRect切割Map,至于切割坐标,例如
    buffMap->Canvas->CopyRect(TRect(0,0,32,16),Map->Canvas,TRect(0,0,32,16));//TRect为切割矩阵
    简单的切割算法就不说了,也就是计算TRect坐标
    3,缩放的问题,查看StretchBlt的API
    4,buffMap->Canvas->CopyRect逆向思维的拷贝回一个新的Map,即所求重新组合后的Map

    楼上的高手,能不能贴点代码出来 啊

    图片是扫描的

    将图片变成BYTE * buf 然后重新放到一个Buffer容器中,按每张图片的行向容器中写.
    写的时候注意地址偏移量和首地址.
    基本思想就这样,我前两天刚做了一个.

  • Filed under: C++ Builder
  • 扫描仪扫描出来的图片通常会发生变形,即图片的长与宽会有变化 ,有的地方压缩,有的地方拉伸。举个例子来说,扫描一张有10*10个格子的图片,每个格子的长与宽都 是1厘米,但是扫描出来 后,你会发现第一排第一个格子的长为1.05厘米,宽变为0.95厘米,第二个格子 的长变为1.01,宽变为1.02,等,即每个格子的变化不一样。现假设扫描出来的图片只有X轴与Y轴的变化,将实物与扫描出来的图片对比 ,得出第一排每个格子的宽度变化与第一列每个格子的高度变化,保存,用这些系数去纠正图片,将其还原为与实物一致的图片,请问怎么做?

    用程序很难自动实现

    放平了在扫描,就不会出现

    操作问题

    看不出有什么规律可循,编程很难实现。

    立体扫描?鱼眼透镜?
    《数字图像处理》那本书上专门有扭曲图像恢复的讨论

    帮你顶一下

  • Filed under: C++ Builder