Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: WinAPI и системное программирование > Где искать буфер TBitmap


Автор: Immortal 31.5.2005, 09:41
Люди добрые помогите, где мне отыскать адрес буфера (ну где хрянятся все пиксели в виде dw), мне просто нужен быстрый доступ к этим самым пикселям и я хочу писать алгоритм обработки на asm, но я не знаю как и где этот буфер храниться... Помогите... Зараннее спасибо.

Автор: Snowy 31.5.2005, 10:54
Насколько я помню, нигде.
Можешь попробовать сохранить в буффер, модифицировать и загрузить обратно.

Автор: Immortal 31.5.2005, 11:09
Я слышал, что надо рыть где-то в GetDIBits, GetDIB, GetDIBSizes но я с Win API не дружу помогите мне плиз.

Автор: Girder 31.5.2005, 11:12
Например:
Код
function HBitmapToCanvas(Source:HBitmap;Canvas:TCanvas;AlphaClr:TColorRef;var Rec:TRect):boolean;
var bmInfo:BITMAPINFO;
    W,H:Integer;
    X,Y,i:Integer;
    bmDIB:HBitmap;
    tColor:TColorRef;
    MemBits:PRGBTriple;
begin
 Result:=false;
 if Source=0 then exit;
 GetObject(Source,SizeOf(bmInfo),@bmInfo);
 W:=bmInfo.bmiHeader.biWidth;
 H:=bmInfo.bmiHeader.biHeight;
 if (W=0)and(H=0) then exit;
 Rec:=Rect(0,0,W,H);
 i:=(W*3)-((W*3) div 4)*4;
 if i<>0 then i:=4-i;
 bmInfo.bmiHeader.biWidth:=W;
 bmInfo.bmiHeader.biHeight:=H;
 bmInfo.bmiHeader.biPlanes:=1;
 bmInfo.bmiHeader.biBitCount:=24;
 bmInfo.bmiHeader.biCompression:=BI_RGB;
 bmInfo.bmiHeader.biSizeImage:=0;
 bmInfo.bmiHeader.biXPelsPerMeter:=2834;
 bmInfo.bmiHeader.biYPelsPerMeter:=2834;
 bmInfo.bmiHeader.biClrUsed:=0;
 bmInfo.bmiHeader.biClrImportant:=0;
 bmInfo.bmiHeader.biSize:=SizeOf(bmInfo.bmiHeader);
 bmDIB:=CreateDIBSection(Canvas.Handle,bmInfo,DIB_RGB_COLORS,Pointer(MemBits),0,0);   
 bmInfo.bmiHeader.biWidth:=W;
 bmInfo.bmiHeader.biHeight:=H;
 bmInfo.bmiHeader.biPlanes:=1;
 bmInfo.bmiHeader.biBitCount:=24;
 bmInfo.bmiHeader.biCompression:=BI_RGB;
 bmInfo.bmiHeader.biSize:=SizeOf(bmInfo.bmiHeader);
 GetDIBits(Canvas.Handle,Source,0,H-1,MemBits,bmInfo,DIB_RGB_COLORS); 
 Y:=H;
 repeat
  dec(Y);
  X:=0;
  while X<W do
   begin
    tColor:=RGB(MemBits.rgbtRed,MemBits.rgbtGreen,MemBits.rgbtBlue);
    if (tColor<>AlphaClr) then Canvas.Pixels[X,Y]:=tColor;
    Inc(MemBits);
    inc(X);
   end;
  PChar(MemBits):=PChar(MemBits)+I;
 until (Y=0);
 DeleteObject(bmDIB);
 Result:=true;
end;

Автор: p0s0l 31.5.2005, 20:52
Если речь про TBitmap (судя по названию темы) - то делай Bmp.ScanLine[0] - адрес начала буфера. Чтобы они были в виде "dw", то предварительно нужно выставить bmp.PixelFormat := pf32bit. Сделай на форуме поиск по слову "ScanLine", найдешь примеры...

Автор: MBo 1.6.2005, 06:25
> Bmp.ScanLine[0] - адрес начала буфера
Не совсем так. В большинстве битмапов строки лежат в обратном порядке, поэтому началом будет Bmp.ScanLine[Height-1]
А для определения нужно помотреть в InfoHeader знак поля biHeight

biHeight

Specifies the height of the bitmap, in pixels. If biHeight is positive, the bitmap is a bottom-up DIB and its origin is the lower left corner. If biHeight is negative, the bitmap is a top-down DIB and its origin is the upper left corner.

Автор: p0s0l 1.6.2005, 10:50
Верно подмечено

Автор: poor_yorik 1.6.2005, 17:50
Если это конечно то что тебе нужно но за пикселю в этой компоненте отвечает свойство
TBitmap.Handle. Указатель на табицу пикселей.
Аналогично
TBitmap.Palette - указатель на палитру.

Автор: MBo 2.6.2005, 06:14
poor_yorik
Это совсем не то

Автор: Dmitry V.Abramov 6.6.2005, 01:26
Цитата(MBo @ 1.6.2005, 06:25)
> Bmp.ScanLine[0] - адрес начала буфера
Не совсем так. В большинстве битмапов строки лежат в обратном порядке, поэтому началом будет Bmp.ScanLine[Height-1]
А для определения нужно помотреть в InfoHeader знак поля biHeight

Совсем не так. Знак biHeight проверяет сама функция GetScanLine перед выдачей результата. Тобишь, ScanLine[0] будет адресом первой строки при любой власти.

Автор: MBo 6.6.2005, 07:12
Dmitry V.Abramov
>ScanLine[0] будет адресом первой строки

Это адрес ВЕРХНЕЙ строки при выводе битмапа, но не всегда начало адресного пространства, отведенного под пиксельный буфер

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)