用Delphi直接獲取bmp圖片的像素


用Delphi直接獲取bmp圖片的像素,並存儲顯示出。(此像素主要用在LED上顯示)。希望高手能給出代碼啊!!

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;

////////////////////////////////////////////

 

 

用Delphi改變圖片的像素,即大小

用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');//保存新圖像



問題回答完了,請測試無誤后立即給分,別拖時間。

你沒有說要壓縮,所以我沒寫壓縮的代碼。其實這種情況最好是要壓縮一下,壓縮代碼也非常簡單(因為我不喜歡太長的代碼),如果你需要請加我QQ5555044

暈。。。。。。。。不知道。。。。。。


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的寬和高不要太大了,否則會出現“儲存空間不足”錯誤。具體多大數值就超出了,具體情況具體分析,你可以自己試一下。 

///////////////////////////////////////

 

 

delphi 取圖片寬高

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;   

可以用TBITMAP得到BMP文件   
  TICON得到ICO文件   
  TJPGIMAGE得到JPEG,JPG文件,DELPHI現只支持這些格式,如要用其它的,呵呵,你自己作解碼算法吧,就沒這么簡單了

//////////////////////////////////////////////////

 

通過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;

////////////////////////////////////////////////////////////////

DELPHI圖像處理研究3 -- 快速判斷JPG大小

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圖像處理研究2 -- 遍歷像素的方法

作者:zjda07 日期:2009-02-04

字體大小:   

 

我逐步寫一些圖像處理方面的經驗作為技術研究或討論吧。

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)。 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM