Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Низкоуровневое программирование > Win Api
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 15.11.2009, 12:22   #1
Alex Cones
Trust no one.
Старожил
 
Аватар для Alex Cones
 
Регистрация: 07.04.2009
Сообщений: 6,526
По умолчанию [Del] TCanvas.pixels → HBitMap

Собственно есть HBitMap. Как обратиться и считать или изменить один из пикселей этого изображения? Или подключать Graphics и связывать TBitMap и HBitMap?
SQUARY PROJECT - НАБОР БЕСПЛАТНЫХ ПРОГРАММ ДЛЯ РАБОЧЕГО СТОЛА.
МОЙ БЛОГ
GRAY FUR FRAMEWORK - УДОБНАЯ И БЫСТРАЯ РАЗРАБОТКА WINAPI ПРИЛОЖЕНИЙ
Alex Cones вне форума Ответить с цитированием
Старый 15.11.2009, 12:52   #2
BOBAH13
Android Developer
Старожил Подтвердите свой е-майл
 
Аватар для BOBAH13
 
Регистрация: 19.02.2007
Сообщений: 3,708
По умолчанию

Что значит есть HBITMAP ? Просто с потолка появился ? Создайвайте через CreateDIBSection, там указываите и получаите прямой доступ (адресс) на первый байт, + у вас доступ как HBITMAP, HDC (через SelectObject), ну и еще Scan0. А вообще, MSDN в помощь, ведь надо заглядывать изредка щас гляну может сразу и скажу

ну и вот ответ: GetDIBBits/SetDIBIBits... вытащить биты, модифицируите, и обратно ставите.

Последний раз редактировалось BOBAH13; 15.11.2009 в 12:54.
BOBAH13 вне форума Ответить с цитированием
Старый 15.11.2009, 12:58   #3
raxp
Старожил
 
Регистрация: 29.09.2009
Сообщений: 9,713
По умолчанию

не нужно TBitMap... допустим:
Код:
var hdcScreen, hdcImage: hdc;
     hBitmaps: hbitmap;
begin
 hBitmaps:= LoadImage(hInstance, text('bmp.bmp'), IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE);

// или
// hdcImage:= CreateCompatibleDC(0);
// hdcScreen:= hdcImage;
// hBitmaps:= CreateCompatibleBitmap(hdcScreen, 16, 16); // если иконку 32х32
 
 ...
 hdcScreen: = GetDC(hWnd);
 hdcImage: =CreateCompatibleDC(hdcScreen);
 SelectObject(hdcImage, hBitmaps);
 BitBlt(hdcScreen, 0, 0, w, h, hdcImage, 0, 0, SRCCOPY);
тогда...
Код:
цвет:= GetPixel(hdcScreen, точка x, точка y); // setpixel(hdc, x, y, цвет)

UPD
---------------

Цитата:
BOBAH13
В принципе да, но, если вызов производится редко, и не часто. Иначе забудьте про программу Будет очень медленно
верно... но так как догадываюсь, где это будет использоваться, там такие скорости не нужны
Разработки и научно-технические публикации :: Видеоблог :: Твиттер
Radar systems engineer & Software developer of industrial automation

Последний раз редактировалось raxp; 15.11.2009 в 13:11.
raxp вне форума Ответить с цитированием
Старый 15.11.2009, 13:03   #4
BOBAH13
Android Developer
Старожил Подтвердите свой е-майл
 
Аватар для BOBAH13
 
Регистрация: 19.02.2007
Сообщений: 3,708
По умолчанию

Цитата:
Сообщение от raxp Посмотреть сообщение
допустим...
тогда...
Код:
цвет:= GetPixel(hdcScreen, точка x, точка y);
В принципе да, но, если вызов производится редко, и не часто. Иначе забудьте про программу Будет очень медленно.
BOBAH13 вне форума Ответить с цитированием
Старый 15.11.2009, 16:36   #5
Alex Cones
Trust no one.
Старожил
 
Аватар для Alex Cones
 
Регистрация: 07.04.2009
Сообщений: 6,526
По умолчанию

Цитата:
hBitmaps:= CreateCompatibleBitmap(hdcScreen, 16, 16); // если иконку 32х32
Мне немного не понятна эта строка. А именно цифры в ней. 16=32? Или нужно домножать на 2? Как тогда создать битмап размером 9*372?
Цитата:
В принципе да, но, если вызов производится редко, и не часто. Иначе забудьте про программу Будет очень медленно.
Общаться с битмапом буду только в начале программы при её загрузке.
SQUARY PROJECT - НАБОР БЕСПЛАТНЫХ ПРОГРАММ ДЛЯ РАБОЧЕГО СТОЛА.
МОЙ БЛОГ
GRAY FUR FRAMEWORK - УДОБНАЯ И БЫСТРАЯ РАЗРАБОТКА WINAPI ПРИЛОЖЕНИЙ
Alex Cones вне форума Ответить с цитированием
Старый 15.11.2009, 17:03   #6
raxp
Старожил
 
Регистрация: 29.09.2009
Сообщений: 9,713
По умолчанию

Цитата:
Мне немного не понятна эта строка. А именно цифры в ней. 16=32? Или нужно домножать на 2? Как тогда создать битмап размером 9*372
просто скопировал из своего модуля вывода текста в трей... забыл убрать 32, виноват

Цитата:
Общаться с битмапом буду только в начале программы при её загрузке
значит ок
Разработки и научно-технические публикации :: Видеоблог :: Твиттер
Radar systems engineer & Software developer of industrial automation
raxp вне форума Ответить с цитированием
Старый 21.11.2009, 13:46   #7
Alex Cones
Trust no one.
Старожил
 
Аватар для Alex Cones
 
Регистрация: 07.04.2009
Сообщений: 6,526
По умолчанию

Цитата:
// или
// hdcImage:= CreateCompatibleDC(0);
// hdcScreen:= hdcImage;
// hBitmaps:= CreateCompatibleBitmap(hdcScreen, 16, 16); // если иконку 32х32

...
hdcScreen: = GetDC(hWnd);
hdcImage: =CreateCompatibleDC(hdcScreen);
SelectObject(hdcImage, hBitmaps);
BitBlt(hdcScreen, 0, 0, w, h, hdcImage, 0, 0, SRCCOPY);

тогда...
Код:


цвет:= GetPixel(hdcScreen, точка x, точка y); // setpixel(hdc, x, y, цвет)
Одновременно можно редактировать несколько битмапов? или это
Код:
 hdcScreen: = GetDC(hWnd);
 hdcImage: =CreateCompatibleDC(hdcScreen);
 SelectObject(hdcImage, ДРУГОЙ БИТМАП);
 BitBlt(hdcScreen, 0, 0, w, h, hdcImage, 0, 0, SRCCOPY);
нужно повторять при начале редактирования следующей картинки? Их у меня 27.
SQUARY PROJECT - НАБОР БЕСПЛАТНЫХ ПРОГРАММ ДЛЯ РАБОЧЕГО СТОЛА.
МОЙ БЛОГ
GRAY FUR FRAMEWORK - УДОБНАЯ И БЫСТРАЯ РАЗРАБОТКА WINAPI ПРИЛОЖЕНИЙ
Alex Cones вне форума Ответить с цитированием
Старый 21.11.2009, 14:02   #8
raxp
Старожил
 
Регистрация: 29.09.2009
Сообщений: 9,713
По умолчанию

если уже есть готовый контексты hdc картинок, то не нужно... если нет, то нужно... эм, хорошо бы проверить... так как сам много картинок не использовал раньше
Разработки и научно-технические публикации :: Видеоблог :: Твиттер
Radar systems engineer & Software developer of industrial automation
raxp вне форума Ответить с цитированием
Старый 21.11.2009, 14:49   #9
Alex Cones
Trust no one.
Старожил
 
Аватар для Alex Cones
 
Регистрация: 07.04.2009
Сообщений: 6,526
По умолчанию

Тогда не буду рисковать и буду задавать каждой отдельно по очереди.
SQUARY PROJECT - НАБОР БЕСПЛАТНЫХ ПРОГРАММ ДЛЯ РАБОЧЕГО СТОЛА.
МОЙ БЛОГ
GRAY FUR FRAMEWORK - УДОБНАЯ И БЫСТРАЯ РАЗРАБОТКА WINAPI ПРИЛОЖЕНИЙ
Alex Cones вне форума Ответить с цитированием
Старый 21.11.2009, 17:40   #10
Alex Cones
Trust no one.
Старожил
 
Аватар для Alex Cones
 
Регистрация: 07.04.2009
Сообщений: 6,526
По умолчанию

Что-то я наверное неправильно делаю, выводится черный прямоугольник.
Код:
Procedure CreateBinImage(W,H:SmallInt; Var BitMap:HBitMap);
Begin
 hdcImage  := CreateCompatibleDC(0);
 hdcScreen := hdcImage;
 BitMap    := CreateCompatibleBitmap(hdcScreen, W, H);
End;

Procedure LoadBinaryImages;
Var
 F,F2:File;
 FFLine:String;
 X,Y:SmallInt;
 I:Byte;
 SomeBit:Byte;
 N:Array[0..15] of Integer;
 MaxX,MaxY:SmallInt;
Begin
 AssignFile(F,Directory.Resource+'\Interface.pack');
 Reset(F,SizeOf(Byte));
 AssignFile(F2,Directory.Resource+'\Palette.pal');
 Reset(F2,SizeOf(N));
 FFLine:='';
 MaxX:=0;
 MaxY:=0;
 While Not (Eof(F)) do
  Begin
   BlockRead(F,SomeBit,1);
   FFLine:=FFline+IntToHex(SomeBit,2);
  End;
 For I:=0 to 26 do
  Begin
   BlockRead(F2,N,1);
    Case I of
     0..1,4..5,7..8,11..12,15..16,20..23,25..26: Begin MaxX:=29; MaxY:=17; End;
     2..3,9..10: Begin MaxX:=61; MaxY:=17; End;
     6: Begin MaxX:=282; MaxY:=47; End;
     13:Begin MaxX:=9; MaxY:=372; End;
     17:begin MaxX:=9; MaxY:=372; End;
     14: Begin MaxX:=282; MaxY:=14; End;
     18..19: Begin MaxX:=152; MaxY:=37; End;
     24: Begin MaxX:=300; MaxY:=28; End;
    End;
   CreateBinImage(MaxX,MaxY, Bit[I]);// Bit.Width:=MaxX; Bit.Height:=MaxY;
   For Y:=0 to MaxY-1 do
    Begin
     For X:=0 to MaxX-1 do
      Begin
       SetPixel(hdcScreen,X,Y,N[StrToInt('$'+Copy(FFLine,1,1))]); //Bit.Canvas.Pixels[X,Y]:=N[StrToInt('$'+Copy(FFLine,1,1))];
       Delete(FFLine,1,1);
      End;
    End;
  End;
 CloseFile(F);
 CloseFile(F2);
 ////////////
 SendMessage(IMGMiddle.Handle, STM_SETIMAGE, IMAGE_BITMAP, Bit[14]);
 ////////////
End;
Если заменить строки на закоментенные, то все работает. Похоже я как-то не так общаюсь с hdc.
SQUARY PROJECT - НАБОР БЕСПЛАТНЫХ ПРОГРАММ ДЛЯ РАБОЧЕГО СТОЛА.
МОЙ БЛОГ
GRAY FUR FRAMEWORK - УДОБНАЯ И БЫСТРАЯ РАЗРАБОТКА WINAPI ПРИЛОЖЕНИЙ
Alex Cones вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
двоичное число→десятичное astrozombie Паскаль, Turbo Pascal, PascalABC.NET 4 06.05.2009 08:32
Графика в Делфи TCanvas Summerrain Помощь студентам 1 19.12.2008 02:39
Вывод HBITMAP AidarBik Win Api 7 30.07.2008 14:21
10.0 mega pixels Paragvay_ Свободное общение 7 08.02.2008 14:53
TListView; не рисует цветом TCanvas JetAPI Компоненты Delphi 9 24.08.2007 22:22