很急。怎样获得图像的大小(filesize),分辨率之类的信息阿?(50分)

  • 主题发起人 主题发起人 花 儿
  • 开始时间 开始时间

花 儿

Unregistered / Unconfirmed
GUEST, unregistred user!
请大家回答,还有什么关于图像的信息都可以。
已知路径,求答案。
 
关键要知道这些图像文件的格式,可以直接从文件中取出这些数据。
 
一般来说文件的头几位bit就是用来记录这些信息的吧,具体要查一下资料
 
对于位图操作:procedure TForm1.BitBtn1Click(Sender: TObject);
var
fileheader:Tbitmapfileheader;
infoheader:Tbitmapinfoheader;
s:Tfilestream;
begin
s:=Tfilestream.Create(openpicturedialog1.FileName,fmopenread);
s.Read(fileheader,sizeof(fileheader)) ;
s.Read(infoheader,sizeof(infoheader));
s.Free;
edit1.Text:=位图大小为: '+inttostr(round(fileheader.bfSize/1024))+'K';
edit2.Text:='位图格式: '+inttostr(infoheader.biBitCount)+'位';
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
if openpicturedialog1.Execute then
begin
image1.Picture.LoadFromFile(openpicturedialog1.filename);
end;
end;

end.
 
谢谢。那jpg格式的呢?很重要阿。
还有图片分辨率?
 
图片是没有分辨率概念的,分辨率是指显示设备(屏幕、打印机)每英寸有
多少点。
简单的方法是用TIMAGE控件加载一个图片(BMP、JPG),将AUTOSIZE设为TRUE,
通过这个控件的Width、Height就知道图片的大小了。
 
下面函数可以用于Jpg
function TFrm_Detail.CheckBitmapVerity(PIC: TPicture): String;
var
PixFormat:Integer;
begin
Result:='';
case Pic.Bitmap.PixelFormat of
pf1bit: PixFormat:=0;//单色
pf4bit: PixFormat:=1;//16色
pf8bit: PixFormat:=2;//256色
pf15bit: PixFormat:=3;//
pf16bit: PixFormat:=4;//16位真彩色
pf24bit: PixFormat:=5;//24位真彩色
pf32bit: PixFormat:=6;//32位真彩色
else PixFormat:=999;
End;
If(Pic.Bitmap.Height>200)or(Pic.Bitmap.Width>200)Then
Begin
Result:='错误原因:图片过大!';
case PixFormat of
0: Result:=Result+#13+#10+'单色';
1: Result:=Result+#13+#10+'16色';
2: Result:=Result+#13+#10+'256色';
3,4: Result:=Result+#13+#10+'16位真彩色';
5: Result:=Result+#13+#10+'24位真彩色';
6: Result:=Result+#13+#10+'32位真彩色';
Else Result:=Result+#13+#10+'未知格式';
End;
Result:=Result+#13+#10+'图片宽:'+IntToStr(Pic.Bitmap.Width);
Result:=Result+#13+#10+'图片高:'+IntToStr(Pic.Bitmap.Height);
Result:=Result+#13+#10+'推荐配置:';
Result:=Result+#13+#10+'256色及以下色彩,200 X 200';
End;
end;
 
调用时:
Jpg.LoadFromFile(fileString);
Jpg.DIBNeeded;
Bmp.Assign(Jpg);
If checkbitmapverity(TmpBmp.Picture)<>'' Then
...
 
图片的大小呢?不要用image.height那种土办法可不可以阿?
 
能不能告诉我如何在将bmp图片加载到内存中,并在内存中读取每个bmp的象素点(并要修改)
,有急用
谢谢:)
 
内存流!
tms: TMemoryStream;
tms:=TMemoryStream.Create;
tms.LoadFromFile(图片路径);
jpg.LoadFromStream(tms);
tms.free
 
为什么我用了内存流以后,将24bit的bmp图片转换成灰度图片好像速度还是很慢?
至于里边的读取象素,是不是用
tms.memory?我不会用,能说的详细一点吗?
譬如我想知道(5,6)坐标的象素值
 
为什么不用 ScanLine 呢?
 
能用内存流再加scanline就好了:)
你知道吗?先谢了
 
用ScanLine行吗?
我不知道,那么内存流里边
tms.memory^是什么呢?
我现在读出来的象素值和我直接读取好像不一样
 
to huazai:
你的使用内存流是加载图片时速度快点吗?我要做的是将24bit图片转换成256色时速度快
不知道能不能使用内存流对里边的象素点进行读取?
 
>> 来自:花 儿, 时间:2002-4-18 16:57:00, ID:1052320
>> 图片的大小呢?不要用image.height那种土办法可不可以阿?

呵呵,我一向都是用这种土办法:(
无论如何,你始终得将图象文件读入内存才能得到这些信息

>> 来自:vikingmao, 时间:2002-4-19 12:16:00, ID:1053816
>> 能用内存流再加scanline就好了:)
>> 你知道吗?先谢了

TBitmap 类里面已经封装了 TStream ,为什么还需要用另外的流呢?
ScanLine 也是从内部的流里读数据呀

据我所知,用 ScanLine 是最快的方法之一喽
 
大家先回答我的问题,赫赫
 
比较常用的做法,而且速度很快!
pRGB: PRGBColor; //就是三个字节的一个record指针;
for Y := 0 to Bmp.Height - 1 do
begin
pRGB := Bmp.ScanLine[Y];
for X := 0 to Bmp.Width - 1 do
begin
pRGB.R := your r;
pRGB.G := your g;
pRGB.B := your b;
end;
Inc(pRGB);
end;
end;
实验证明:比vc下用文件流快多了。
 
后退
顶部