回 帖 发 新 帖 刷新版面

主题:使用像素数组构造bmp

请问,我已将一幅bmp的像素值读到了一个二维动态数组中,想检验一下读到数组中的值是否正确,怎样利用数组中的值再重新构造一幅bmp啊?谢谢了~~提供的方法可行,一定给高分!!

回复列表 (共11个回复)

沙发

能把您读出数据的代码拿出来看看吗?谢谢

板凳

Type
 TPixels = Array of Array of TRGBTriple
procedure ReadPixel(LocalBmp:TBitmap; var tPix:TPixels);
var
  PixPtr: PbyteArray;
  i,j,m: Integer;
begin
  SetLength(tPix,LocalBmp.Width,LocalBmp.Height);
  LocalBmp.PixelFormat:=pf24bit;
  LocalBmp.HandleType:=bmDIB;
  for i:=0 to LocalBmp.Height-1  do
    begin
      PixPtr:=LocalBmp.ScanLine[i];
      for j:=0 to LocalBmp.Width-1  do
        begin
           m:=j*3;
           tPix[j,i].rgbtBlue:=PixPtr[m];
           tPix[j,i].rgbtGreen:=PixPtr[m+1];
           tPix[j,i].rgbtRed:=PixPtr[m+2];
         end;
     end;
这就是代码~~Glad to help~!对你有作用的话别忘了给我加点分哦~~嘿嘿

3 楼

希望对你有帮助

4 楼

var
  temp:Tbitmap;
  i,j:integer;
begin
  temp := Tbitmap.create;
  temp.width := 100;
  temp.height := 100;
  for i:=0 to temp.width - 1 do
    for j:=0 to temp.height - 1 do
      temp.Canvas.Pixels[i,j] := 颜色值
  temp.savetofile('c:\1.bmp');
end;

这样?如果颜色值的地方填0就是个100*100的黑色BITMAP

5 楼

感谢楼主,只是俺的天赋有限,一时不吃不透

6 楼

Type
 TPixels = Array of Array of TRGBTriple;// 定义一个二维动态数组TPixels,类  型为 TRGBTriple,它是一个记录类型,可以保存一个像素值的R,G,B分量
procedure ReadPixel(LocalBmp:TBitmap; var tPix:TPixels);
var
  PixPtr: PbyteArray; // PixPtr用于存取每一行的像素信息的指针
  i,j,m: Integer;
begin
  SetLength(tPix,LocalBmp.Width,LocalBmp.Height);
  LocalBmp.PixelFormat:=pf24bit; //24位位图格式
  LocalBmp.HandleType:=bmDIB; //强制把当前Bitmap的操作方式转化为位处理方式
    //循环结构用来读取像素信息
  for i:=0 to LocalBmp.Height-1  do
    begin
      PixPtr:=LocalBmp.ScanLine[i];
      for j:=0 to LocalBmp.Width-1  do
        begin
           m:=j*3; //因为是24位位图,每个像素占3个字节
           tPix[j,i].rgbtBlue:=PixPtr[m];
           tPix[j,i].rgbtGreen:=PixPtr[m+1];
           tPix[j,i].rgbtRed:=PixPtr[m+2];
         end;
     end;

7 楼

punkrocker:
  用Pixel[i,j]读取像素值太慢了啊

8 楼

API里有一个SetPixel(大概是这么写),获得你要画的东西的句柄,然后赋值涂色,不过不知道效率怎么样

9 楼


   那哥们能把你从BMP格式图片读到二维数组的代码发一下吗,是用C++写的吗?

10 楼


  忘了补充了,是读到二维数组后并输出数组中的所有元素的程序,它的结果就像这样
 [16][16]=   {     
          {   0,235,59,219,15,231,55,215,2,232,56,217,12,229,52,213},     
          {128,64,187,123,143,79,183,119,130,66,184,120,140,76,180,116},     
          {33,192,16,251,47,207,31,247,34,194,18,248,44,204,28,244},     
          {161,97,144,80,175,111,159,95,162,98,146,82,172,108,156,92},     
          {8,225,48,208,5,239,63,223,10,226,50,210,6,236,60,220},     
          {136,72,176,112,133,69,191,127,138,74,178,114,134,70,188,124},     
          {41,200,24,240,36,197,20,255,42,202,26,242,38,198,22,252},     
          {169,105,152,88,164,100,148,84,170,106,154,90,166,102,150,86},     
          {3,233,57,216,13,228,53,212,1,234,58,218,14,230,54,214},     
          {131,67,185,121,141,77,181,117,129,65,186,122,142,78,182,118},     
          {35,195,19,249,45,205,29,245,32,193,17,250,46,206,30,246},     
          {163,99,147,83,173,109,157,93,160,96,145,81,174,110,158,94},     
          {11,227,51,211,7,237,61,221,9,224,49,209,4,238,62,222},     
          {139,75,179,115,135,71,189,125,137,73,177,113,132,68,190,126},     
          {43,203,27,243,39,199,23,253,40,201,25,241,37,196,21,254},     
          {171,107,155,91,167,103,151,87,168,104,153,89,165,101,149,85},

我来回复

您尚未登录,请登录后再回复。点此登录或注册