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

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

Вернуться   Форум программистов > Delphi программирование > Мультимедиа в Delphi
Регистрация

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 28.07.2013, 16:50   #1
J1Mmy
Пользователь
 
Аватар для J1Mmy
 
Регистрация: 10.05.2012
Сообщений: 24
По умолчанию TImage, Canvas, Pixels. пропадает изображение

доброго времени суток. появилась нужна сделать "картиночную кнопку". выбрал в качестве родительского класса TImage. добавил всяческие обработчики и с обычными изображениями(bmp, jpeg) всё отлично. Но, хотел переделать под png, чтобы навод мыши определялся если пиксель[х,у] не прозрачен.
Попробовал через
Код:
if Picture.Bitmap.Canvas.Pixels[msg.XPos, msg.YPos] <> -1 then
Но столкнулся с тем, что эта проверка, а точнее вызов
Код:
Picture.Bitmap.Canvas.Pixels[msg.XPos, msg.YPos]
вызывает сброс всей канвы кнопки, что в итоге она(картинка) просто исчезает. Кто сталкивался с этим? можете ткнуть, что не так делаю... Заранее благодарен
J1Mmy вне форума Ответить с цитированием
Старый 28.07.2013, 19:08   #2
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Я сталкивался. Давно. Поставил сторонние компоненты (от JEDI кажись) - это дало плоды. Классический Image в этом плане нододелан. Впрочем может быть в новых Делфи уже решена эта проблема с несовмещением битмапа и канвы.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 29.07.2013, 10:37   #3
J1Mmy
Пользователь
 
Аватар для J1Mmy
 
Регистрация: 10.05.2012
Сообщений: 24
По умолчанию

Я попробовал так-же в качестве родительского TGraphicControl брать, с ним та же история... наверное потому, что я подглядывал в TImage, когда делал.
J1Mmy вне форума Ответить с цитированием
Старый 29.07.2013, 11:40   #4
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Я бы делал на основе TPaintBox такие вещи.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 29.07.2013, 15:44   #5
xrob
Форумчанин
 
Регистрация: 18.10.2010
Сообщений: 419
По умолчанию

А я бы опустился до уровня ScanLine.
у TPNGObject есть ScanLine для самого изображения и AlphaScanline для маски прозрачности
xrob вне форума Ответить с цитированием
Старый 29.07.2013, 16:35   #6
J1Mmy
Пользователь
 
Аватар для J1Mmy
 
Регистрация: 10.05.2012
Сообщений: 24
По умолчанию

ScanLine необходим при переносе/наложении, ибо выдает строками. а мне надо обрабатывать точками, чтобы можно было делать кнопки любой формы и сложности, и реагировали только при наводе на непрозрачный пиксель
J1Mmy вне форума Ответить с цитированием
Старый 29.07.2013, 19:39   #7
Rin
Негодник
Форумчанин
 
Аватар для Rin
 
Регистрация: 10.11.2009
Сообщений: 880
По умолчанию

Вот так можно обратиться именно к пикселю.
Код:
type 
  TRGBA; = packed record
    rgbtBlue: Byte;
    rgbtGreen: Byte;
    rgbtRed: Byte;
    rgbtAlpha:Byte;
   end;
PRGBA = ^TRGBA;
................
function GetPixel(My_BitMap:TBitmap;X, Y: Integer): TColor;
var
  P: PRGBA;
begin
  P:= My_Bitmap.ScanLine[Y];
  Inc(P, X);
  Result:= (P^.rgbtBlue shl 24) or (P^.rgbtGreen shl 16) or (P^.rgbtRed shl 8) or P^.rgbtAlpha;
end;

procedure foo();
var BM:TBitMap;
begin
BM:=TBitMap.Create;
BM.LoadFromFile('путь\*.*');
if (GetPixel(BM,4,5)=clWhite) then showmessage('Белый я, белый!');
end;
Если помог, проси поставить минус. Будь оригинален!

Последний раз редактировалось Rin; 29.07.2013 в 19:47.
Rin вне форума Ответить с цитированием
Старый 29.07.2013, 22:59   #8
xrob
Форумчанин
 
Регистрация: 18.10.2010
Сообщений: 419
По умолчанию

Цитата:
ScanLine необходим ... а мне надо ...
J1Mmy, кто хочет - ищет возможность.

Код:
uses PNGImage;
var PNG:TPNGObject;

procedure TForm1.FormCreate(Sender: TObject);
begin
PNG:=TPNGObject.Create;
PNG.LoadFromFile('C://test.png');
PNG.CreateAlpha;
end;



procedure TForm1.FormMouseMove(Sender: TObject; Shift: TShiftState; X,Y: Integer);
var
p:PByteArray;
b:byte;
begin
//PNG-картинка рисуется на форме в координатах 0:0, 
//поэтому X и Y координат мышки совпадают с координатами картинки
p:=PNG.AlphaScanline[y];
b:=p^[x];
caption:=inttostr(b); // показать непрозрачность пиксела 
end;
xrob вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Timage + Canvas = увеличение (как?) kirsan007 Общие вопросы Delphi 4 06.04.2011 17:39
При изменении размеров Timage canvas не увеличивается BloodMaX Общие вопросы Delphi 1 15.04.2010 12:28
Проблема с рисованием на canvas`e Timage (Delphi) Dalagardi Помощь студентам 9 25.03.2010 20:55