function getImagePixels(f: string): Integer;
var
jpg: TJpegImage;
bmp: TBitmap;
begin
Result := 0;
if not FileExists(f) then
Exit;
if SameText(ExtractFileExt(f), '.bmp') then
begin
bmp := TBitmap.Create;
try
bmp.LoadFromFile(f);
Result := bmp.Width * bmp.Height;
finally
FreeAndNil(bmp);
end;
end
else if SameText(ExtractFileExt(f), '.jpg') then
begin
jpg := TJpegImage.Create;
try
jpg.LoadFromFile(f);
Result := jpg.Width * jpg.Height;
finally
FreeAndNil(jpg);
end;
end;
end;
////////////////////////////////////////////web
用Delphi改變圖片的像素,即大小.需代碼!急用,謝謝!算法
我給你講一種很是簡單的方法:
第一步:在窗體上放上image1和image2兩個圖片控件。再放一個Button按鈕控件。
第二步:在image1的Picture屬性中載入一張JPG或者BMP圖片。而image2不要管它。
第三步:雙擊Button進行按扭編寫環境。寫入下面代碼:
Image2.Height := 200;//新圖像高度
Image2.Width := 300;//新圖像寬度
Image2.Canvas.StretchDraw(Image2.ClientRect,Image1.Picture.Graphic);
Image2.Picture.SaveToFile('c:/b.jpg');//保存新圖像
問題回答完了,請測試無誤後當即給分,別拖時間。
你沒有說要壓縮,因此我沒寫壓縮的代碼。其實這種狀況最好是要壓縮一下,壓縮代碼也很是簡單(由於我不喜歡太長的代碼),若是你須要請加我QQ5555044less
暈。。。。。。。。不知道。。。。。。函數
uses添加Jpeg.
var
bmp,bmp1:TBitmap;
jpeg:TJpegImage;
str:string;
begin
str:='你的圖片的完整路徑+圖片名'
if (ExtractFileExt(str)='.JPG') or (ExtractFileExt(str)='.jpg') then
begin
jpeg:=TJpegImage.Create;
try
jpeg.LoadFromFile(str);
bmp:=TBitmap.Create;
try
bmp.Width:=strtoint(edit1.Text);
bmp.Height:=strtoint(edit2.Text);
bmp.Canvas.StretchDraw(rect(0,0,bmp.Width,bmp.Height),jpeg);
jpeg.Assign(bmp);
finally
bmp.Free;
end;
jpeg.SaveToFile('D:/aa.jpg');
finally
jpeg.Free;
end;
end;
end;
if (ExtractFileExt(str)='.BMP') or (ExtractFileExt(str)='.bmp') then
begin
bmp1:=TBitmap.Create;
try
bmp1.LoadFromFile(str);
bmp:=Tbitmap.Create;
try
bmp.Width:=strtoint(edit1.Text);
bmp.Height:=strtoint(edit2.Text);
bmp.Canvas.StretchDraw(rect(0,0,bmp.Width,bmp.Height),bmp1);
bmp1.Assign(bmp);
finally
bmp.Free;
bmp1.SaveToFile('D:/aa.bmp');
end;
finally
bmp1.Free;
end;
end;
end;
只是edit1和edit2中添加的bmp的寬和高不要太大了,不然會出現「儲存空間不足」錯誤。具體多大數值就超出了,具體狀況具體分析,你能夠本身試一下。 測試
///////////////////////////////////////字體
Var
Bmp:TBitMap;
Stream:TMemoryStream;
begin
Bmp :=TBitMap.Create;
Bmp.LoadFromFile('XX.BMP');
//尺寸
PX :=Bmp.Width ;
PY :=Bmp.Height;
Stream:=TMemoryStream.Create;
Bmp.SaveToStream(Stream);
//大小
Size :=Stream.Size;
Stream.Free;
Bmp.Free;
end; .net
能夠用TBITMAP獲得BMP文件
TICON獲得ICO文件
TJPGIMAGE獲得JPEG,JPG文件,DELPHI現只支持這些格式,如要用其它的,呵呵,你本身做解碼算法吧,就沒這麼簡單了指針
//////////////////////////////////////////////////orm
經過QQ截圖來的圖片 在delphi作的程序中按一下按鈕把圖片顯示在image控件上
procedure TForm1.Button1Click(Sender: TObject);
var
i:integer;
FIsBitmap:boolean;
begin
FIsBitmap:=false;
for i:=0 to clipboard.FormatCount -1 do //檢測ClipBoard中是否有位圖
if Clipboard.Formats[i]=2 then
begin
FIsBitmap:=true;
break;
end;
if FIsBitmap then
Image1.Picture.LoadFromClipBoardFormat(cf_BitMap,ClipBoard.GetAsHandle(cf_Bitmap),0)
else
Showmessage('剪貼板中沒有圖片!');
end;
////////////////////////////////////////////////////////////////blog
Jpeg圖像是應用最爲普遍的圖像格式之一。Borland已經爲JPG進行了封裝,只要在uses語句中加入jpeg單元,就能夠直接用TImage解讀Jpeg文件了。
對於TJpegImage類,相對比較簡單。說些特殊的處理吧。
數碼照片通常都很大,如今千萬像素級的照片,讀取JPG的時間會很長。TJpegImage有一個Scale屬性,在解讀JPEG圖像以前,先設置Scale,就能夠快速解讀。讀取的速度能夠是徹底解讀時的4倍、8倍,固然解讀的圖像內容也只有整圖的1/4或1/8的大小。但若是咱們解讀了照片之後只是顯示在屏幕上,每每不須要讀取整圖,也許1/8的大小已經足夠顯示了。
問題是,如何事先知道Jpeg圖像的長和寬的尺寸呢?只有事先知道照片的大小,才能知道應該設置多少的Scale,纔可能有效地縮小讀取圖像。這裏有個函數能夠快速獲得JPG的長和寬,經過讀取JPG的頭信息從而知道圖像大小,而不須要解讀整個圖像。
procedure GetJPGSize(const sFile: string; var wWidth, wHeight: word);
const
ValidSig : array[0..1] of byte = ($FF, $D8);
Parameterless = [$01, $D0, $D1, $D2, $D3, $D4, $D5, $D6, $D7];
var
Sig: array[0..1] of byte;
f: TFileStream;
x: integer;
Seg: byte;
Dummy: array[0..15] of byte;
Len: word;
ReadLen: LongInt;
begin
FillChar(Sig, SizeOf(Sig), #0);
f := TFileStream.Create(sFile, fmOpenRead);
try
ReadLen := f.Read(Sig[0], SizeOf(Sig));
for x := Low(Sig) to High(Sig) do
if Sig[x] <> ValidSig[x] then ReadLen := 0;
if ReadLen > 0 then
begin
ReadLen := f.Read(Seg, 1);
while (Seg = $FF) and (ReadLen > 0) do
begin
ReadLen := f.Read(Seg, 1);
if Seg <> $FF then
begin
if (Seg = $C0) or (Seg = $C1) then
begin
ReadLen := f.Read(Dummy[0], 3); { don't need these bytes }
wHeight := ReadMWord(f);
wWidth := ReadMWord(f);
end else begin
if not (Seg in Parameterless) then
begin
Len := ReadMWord(f);
f.Seek(Len-2, 1);
f.Read(Seg, 1);
end else
Seg := $FF;
end;
end;
end;
end;
finally
f.Free;
end;
end;
在wWidth, wHeight中將返回JPG文件的長寬。這樣,咱們在顯示JPG照片的時候,能夠先經過GetJPGSize獲得照片的長和寬,而後根據將要顯示的屏幕大小,有效設置TJpegImage的Scale屬性,快速顯示Jpg圖像。
////////////////////////////////////////////////////////////
我逐步寫一些圖像處理方面的經驗做爲技術研究或討論吧。DELPHI中,全部的圖像須要對圖像的內容進行處理以前,都應該先轉換成TBitmap類。除非只是簡單地顯示一下圖像,或者事先已經有類把相應的功能進行打包。TBitmap類是DELPHI已經封裝好的,訪問的速度也至關快。處理前通常把BMP轉換成24位的圖像深度PixelFormat := pf24bit;這麼作的好處是,此後的代碼處理比較簡單化了,能夠避免因爲顏色深度不一樣而引發的錯位或內容錯亂等莫名其妙的問題。接下來講一下如何訪問圖像的內容。請耐心看,可能要看好幾篇這系列的文章才能開始真正地編寫程序。訪問圖像的內容,能夠直接利用bmp的畫面屬性Canvas。Canvas是由一個一個像素組成的,能夠直接引用這些像素,就能夠得到這些點的顏色值。例如左上角的第一個點是bmp.Canvas.Pixels[0, 0];它的值是TColor。我寫了一個函數能夠直接把TColor中R(紅)、G(綠)、B(藍)三個份量的值分離出來:procedure GetRGBFromColor(color: TColor; var r, g, b: Integer);begin r := color and $000000FF; g := (color shr 8) and $000000FF; b := (color shr 16) and $000000FF;end;用Pixels去訪問bmp是最基本的,也是最直接最簡單的,只要給出座標值就能夠獲利顏色。但這種方法的缺點是,運算的速度比較慢。若是咱們要對整張照片的全部像素值都進行遍歷和讀取,速度是極慢的。接下來介紹bmp訪問中最經常使用的方法吧。爲了克服pixels訪問太慢的問題,Borland爲TBitmap增長了一個Scanline的方法,利用它能夠快速定位圖像的某一行,利用指針的移動對圖像內容進行讀寫。能夠說,絕大部分圖像處理代碼,都是利用這各方法進行訪問的。在使用Scanline以前,請在代碼最前面interface加入如下代碼interface{$DEFINE USE_SCANLINE}讓咱們用一個令圖像內容變成灰度圖的代碼例子看一下scanline的使用吧procedure GrayScale(var clip: tbitmap);var p0:pbytearray; Gray,x,y: Integer;begin for y:=0 to clip.Height-1 do begin p0:=clip.scanline[y]; for x:=0 to clip.Width-1 do begin Gray:= Round(p0[x*3] * 0.3 + p0[x*3 + 1] * 0.59 + p0[x*3 + 2] * 0.11); p0[x*3]:=Gray; p0[x*3+1]:=Gray; p0[x*3+2]:=Gray; end; end;end;p0是一個指針,y值是須要讀取的圖像的行數,p0:=clip.scanline[y]即表示讀取第y行的內容。x是表示列數,p0[x*3]、p0[x*3+1]、p0[x*3+2]分別表示第x列的像素的BGR三個份量的值。只要直接修改p0[x*3]、p0[x*3+1]、p0[x*3+2],就可讓圖像內容發生改變。上面的函數中,咱們先讀取了某一個點的紅綠藍的值,而後進行運算獲得一個灰度值,再把灰度值賦給紅綠藍份量。當某一個點的RGB三值相同時,這個點顯示的顏色就是灰色的了。能夠有人對Gray的運算有疑問,後面的三個係數是如何獲得的,這很簡單,咱們能夠修改這三個係數爲其餘值的,只不過根據大部分人的經驗,當三個係數爲這樣取值時,彩色轉換爲灰度獲得的效果最接近人類的視覺感覺而已。這裏對Gray的輸出還少了一步溢出值的檢驗,凡是賦給RGB的值,必須是0-255之間的(不難理解,RGB各點8位,共24位。8位的最大值是255)。