C++Builder 程序员博客
4 Jan
为什么我用BCB在mysql里存的图片不能大于10K以上,很奇怪!
我的代码
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字段大小
看视字段设的不够.
sql server 里面好象没有这个问题,1MB的图片都可以存储
23 Dec
我想把数据流和图片存放到MSSQL中,不知道如何实现
控件我用的是ADOQUERY,最好是通过SQL语句的INSERT 和 UPDATE来操作,这样比较方便通用一点
我现在的思路是:
一/把文件读出来后存到数据库中
这一步我没有试过,但感觉有点麻烦,图片里的数据估计会包含\0所以用语句好象没办法解决。
这个可以用TEXT类型字段吧
二/把图片里的数据进行Image1->Picture->Bitmap->SaveToStream(Buffer)操作在存入数据库
这一步我不知道如何把Buffer存放数据库中
这个应该是用IMAGE字段吧
不知道大家有没有什么更好的办法,或是能帮我解决这二个办法中的一个怎么做也好
谢了各位大吓们。
或者数据库中存放图片的路径,图片存在在硬盘的目录中
二楼的方法是现在大多人所接受的.那样速度快效率高.
建一个图片目录,还是把PACH TO Save DATABASE 比较好.
其实各有利弊的。
//选择一张图片上传到数据库 已测试 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; } } } }
//用流的方式存取图片 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 过二天就结贴
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
15 Dec
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();
这是什么原因????
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
//取出图片 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;
12 Dec
请问各位高手,我怎么实现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();
}
急,怎还没有人回答呢??高手呢????
17 Nov
bmp格式的可以导入image控件再取相应像素点的值,但其它格式有什么办法.还有GIF动画怎么截取每一帧.?
还有GIF动画怎么截取每一帧.?
—————————–
用PHOTOSHOP的ImageReady程序的导出功能可把GIF的每一帧产生出JPG一批,
我常用它分解每一帧
这不会有简单的方法,BCB6以下版本都不支持GIF,除非用第三方的
MARK
可以用CxImage或GDI Plus载入GIF文件其中的某一帧。
CxImage载入多帧文件的方法:
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取就可以了
谢谢.我试试..
16 Nov
在BCB下如何实现图片拼接的问题:
1.假设一个20*20的正方形方格图片,用程序将其几个一样的方格拼接成俄罗斯方块图片。
2.拼接后的图片能够像一个图一样及整体操作。可以鼠标拖动的。
希望各位高手给点思路。要是有代码参考甚好。谢谢!!!!!。
帮忙顶一下,让了解的人来解答.
给个思路吧,代码自己写
假设你要把2个2*2的正方形拼成长方形,那就首先声名一个2*4的画布。再用copyrect函数把正方形1,2分别按坐标重绘到画布上。把这个画布生成图片,在图的mousedown事件里设计鼠标按着拖动的代码。
我想的是拼接后的图片是不规则的,只显示不规则的图片,不要那些画布上的白色区域。
在画布上拼接好一个不规则图片后,总有白色区域,拖动它的时候还是一个矩形。我想拖动时就是不规则的图片。不需要白色区域。怎么办呢?
俄罗斯方块的图形,都是些小正方形组成的。你定义相对尺寸的矩阵画布,把空白部分填成背景颜色。
因为我要处理图片边界问题,需要用到坐标来定位。比如2个不规则的俄罗斯方块,只能对角接触,不能挨边接触。这样就要使用坐标了,可是我每个图都是不一样的,这样定位坐标那不得挨个定位吗?不知道讲清楚了没有。
俄罗斯方块如果以一个小图为基准,其它3块相对于基准方块有8个位置,设一结构里面有四个图片指针和三个标记,标记记录了每个图片对应基准图的位置,用一个函数处理基准图移动,同时其它图根据标记和基准图最终位置算出绝对坐标,在整块移动时,调用这个函数。做成class更好
只是有这个思路,以前做过,找不到代码了
只要那个结构的代码,“设一结构里面有四个图片指针和三个标记”。就这个结构。可以吗?我想要是那个俄罗斯方块是5个小方格组成也是这样的思路吧!
2 Nov
如何将一个图片切割成等高度,等宽度的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; )
学习一下
30 Oct
这是我的代码,
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;
//给你代码修改并注释了点 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
这里有你想要滴~~
晕,我试了是可以的。
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;
30 Oct
例如:如何把一张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容器中,按每张图片的行向容器中写.
写的时候注意地址偏移量和首地址.
基本思想就这样,我前两天刚做了一个.
28 Oct
扫描仪扫描出来的图片通常会发生变形,即图片的长与宽会有变化 ,有的地方压缩,有的地方拉伸。举个例子来说,扫描一张有10*10个格子的图片,每个格子的长与宽都 是1厘米,但是扫描出来 后,你会发现第一排第一个格子的长为1.05厘米,宽变为0.95厘米,第二个格子 的长变为1.01,宽变为1.02,等,即每个格子的变化不一样。现假设扫描出来的图片只有X轴与Y轴的变化,将实物与扫描出来的图片对比 ,得出第一排每个格子的宽度变化与第一列每个格子的高度变化,保存,用这些系数去纠正图片,将其还原为与实物一致的图片,请问怎么做?
用程序很难自动实现
放平了在扫描,就不会出现
操作问题
看不出有什么规律可循,编程很难实现。
立体扫描?鱼眼透镜?
《数字图像处理》那本书上专门有扭曲图像恢复的讨论
帮你顶一下