Модераторы: Snowy, bartram, MetalFan, bems, Poseidon, Riply
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Где искать буфер TBitmap 
:(
    Опции темы
Immortal
Дата 31.5.2005, 09:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 33
Регистрация: 15.8.2003

Репутация: нет
Всего: нет



Люди добрые помогите, где мне отыскать адрес буфера (ну где хрянятся все пиксели в виде dw), мне просто нужен быстрый доступ к этим самым пикселям и я хочу писать алгоритм обработки на asm, но я не знаю как и где этот буфер храниться... Помогите... Зараннее спасибо.
PM MAIL ICQ   Вверх
Snowy
Дата 31.5.2005, 10:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 11363
Регистрация: 13.10.2004
Где: Питер

Репутация: 30
Всего: 484



Насколько я помню, нигде.
Можешь попробовать сохранить в буффер, модифицировать и загрузить обратно.
PM MAIL   Вверх
Immortal
Дата 31.5.2005, 11:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 33
Регистрация: 15.8.2003

Репутация: нет
Всего: нет



Я слышал, что надо рыть где-то в GetDIBits, GetDIB, GetDIBSizes но я с Win API не дружу помогите мне плиз.
PM MAIL ICQ   Вверх
Girder
Дата 31.5.2005, 11:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Лентяй 2
***


Профиль
Группа: Участник Клуба
Сообщений: 1993
Регистрация: 12.5.2004

Репутация: 25
Всего: 155



Например:
Код
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;


Это сообщение отредактировал(а) Girder - 31.5.2005, 11:14


--------------------
Как слышим, так и пишим.
Истина где-то там...
PM   Вверх
p0s0l
Дата 31.5.2005, 20:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Г-н Посол
****


Профиль
Группа: Экс. модератор
Сообщений: 3668
Регистрация: 13.7.2003
Где: 58°38' с.ш. 4 9°41' в.д.

Репутация: 14
Всего: 112



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



--------------------
С уважением, г-н Посол.
PM   Вверх
MBo
Дата 1.6.2005, 06:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 234
Регистрация: 10.6.2002

Репутация: 1
Всего: 18



> 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.
PM MAIL   Вверх
p0s0l
Дата 1.6.2005, 10:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Г-н Посол
****


Профиль
Группа: Экс. модератор
Сообщений: 3668
Регистрация: 13.7.2003
Где: 58°38' с.ш. 4 9°41' в.д.

Репутация: 14
Всего: 112



Верно подмечено


--------------------
С уважением, г-н Посол.
PM   Вверх
poor_yorik
Дата 1.6.2005, 17:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 148
Регистрация: 12.1.2005
Где: Общаги г. Киева

Репутация: нет
Всего: 8



Если это конечно то что тебе нужно но за пикселю в этой компоненте отвечает свойство
TBitmap.Handle. Указатель на табицу пикселей.
Аналогично
TBitmap.Palette - указатель на палитру.
--------------------
Семь раз отмерь, один раз - откомпиль.... Семь раз отпей, один раз - отлей... Семь раз отъешь, один раз - не жадничай и другим дай...
PM MAIL YIM   Вверх
MBo
Дата 2.6.2005, 06:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 234
Регистрация: 10.6.2002

Репутация: 1
Всего: 18



poor_yorik
Это совсем не то
PM MAIL   Вверх
Dmitry V.Abramov
Дата 6.6.2005, 01:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 177
Регистрация: 30.9.2003
Где: Saint-Petersburg

Репутация: нет
Всего: 4



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

Совсем не так. Знак biHeight проверяет сама функция GetScanLine перед выдачей результата. Тобишь, ScanLine[0] будет адресом первой строки при любой власти.
--------------------
/DVA
PM MAIL WWW   Вверх
MBo
Дата 6.6.2005, 07:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 234
Регистрация: 10.6.2002

Репутация: 1
Всего: 18



Dmitry V.Abramov
>ScanLine[0] будет адресом первой строки

Это адрес ВЕРХНЕЙ строки при выводе битмапа, но не всегда начало адресного пространства, отведенного под пиксельный буфер
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: WinAPI и системное программирование"
Snowybartram
MetalFanbems
PoseidonRrader
Riply

Запрещено:

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Delphi обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи
  • 99% ответов по WinAPI можно найти в MSDN Library, оставшиеся 1% здесь

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, bartram, MetalFan, bems, Poseidon, Rrader, Riply.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: WinAPI и системное программирование | Следующая тема »


 




[ Время генерации скрипта: 0.0789 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.