用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;

////////////////////////////////////////////web

 

 

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



问题回答完了,请测试无误后当即给分,别拖时间。

你没有说要压缩,因此我没写压缩的代码。其实这种状况最好是要压缩一下,压缩代码也很是简单(由于我不喜欢太长的代码),若是你须要请加我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的宽和高不要太大了,不然会出现“储存空间不足”错误。具体多大数值就超出了,具体状况具体分析,你能够本身试一下。 测试

///////////////////////////////////////字体

 

 

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;   .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

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

相关文章
相关标签/搜索