2 / 2 / 2
Регистрация: 29.09.2012
Сообщений: 444
1

Получить цвет пикселя с альфаканалом

11.07.2016, 13:54. Показов 1611. Ответов 8
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте.

Как получить цвет указанного пикселя с альфаканалом из файла png?

Так естественно не получить:

Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
procedure Tcc_main.btn1Click(Sender: TObject);
begin
 png := TPNGObject.create;
 if od.Execute then png.LoadFromFile(od.FileName);
end;
 
 
 
procedure Tcc_main.btn3Click(Sender: TObject);
var
Pix:TColor;
begin
  Pix:= png.Canvas.Pixels[i,j];
end;
Добавлено через 54 минуты
Пробую так, но цвет немного не верный

Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
procedure TForm1.btn1Click(Sender: TObject);
begin
 if od.Execute then png.LoadFromFile(od.FileName);
 Image1.Picture.Assign(png);
end;
 
 
procedure TForm1.Button1Click(Sender: TObject);
var Color: TColor;
    r, g, b, a: Byte;
    ByteAr: pByteArray;
    x, y: Integer;
begin
 
  x := 151;
  y := 42;
 
  Color := PNG.Pixels[x, y];
  ByteAr := PNG.AlphaScanline[y];
 
  r := Color shr 0;
  g := Color shr 8;
  b := Color shr 16;
 
  a := ByteAr[x];
 
  Caption := 'Пиксель [' + IntToStr(x) + ' : ' + IntToStr(y) + '] -> r = ' + IntToStr(r) +
                     ', g = ' + IntToStr(g) + ', b = ' + IntToStr(b) + ', a = ' + IntToStr(a);
 
end;

Вместо 251,2,253,2 - выводит 251, 0,255,0.
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
11.07.2016, 13:54
Ответы с готовыми решениями:

Можно ли получить цвет пикселя картинки, не выводя ее?
Здравствуйте. Подскажите, можно ли получить цвет определенного пикселя картинки, не выводя ее на...

Как получить цвет пикселя из палитры BMP 8bit
Добрый день! Нужна помощь в разработке кода процедуры как известно, в BMP 8bit файле на пиксель...

Цвет пикселя
Ребята, можно ли сохранить цвет пикселя, на которую ты нажал левой кнопкой мыши, в переменную типа...

Цвет пикселя!
Ищу в Image все пикселя белового цвета и задаю им другой цвет, но какой бы я цвет не задал (clBlue,...

8
590 / 457 / 147
Регистрация: 09.12.2013
Сообщений: 2,385
Записей в блоге: 2
11.07.2016, 14:07 2
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
      Private { Private declarations }
            PNG: TPNGObject;
            pX: Integer;
            pY: Integer;
 
...
 
Procedure TForm1.FormCreate(Sender: TObject);
Var FileName: String;
Begin
FileName:='C:\Users\BOGGART\Downloads\step1.png';
If FileExists(FileName) Then
      Begin
      PNG:=TPNGObject.Create();
      PNG.LoadFromFile(FileName);
      pX:=40;
      pY:=30;
      End;
End;
 
Procedure TForm1.FormDestroy(Sender: TObject);
Begin
PNG.Free();
End;
 
Procedure TForm1.Button1Click(Sender: TObject);
Var Col: TColor;
Begin
Col:=PNG.Canvas.Pixels[pX, pY];
ShowMessage('#'+IntToHex(Col, 8));
End;
 
Procedure TForm1.Button2Click(Sender: TObject);
Var Col: TColor;
Begin
Col:=PNG.Pixels[pX, pY];
ShowMessage('#'+IntToHex(Col, 8));
End;
 
procedure TForm1.Button3Click(Sender: TObject);
Var Col: TColor;
Begin
Col:=PNG.Pixels[pX, pY];
If PNG.AlphaScanline[pY]<>Nil Then
      Col:=Col Or (PNG.AlphaScanline[pY][pX] Shl 24);
ShowMessage('#'+IntToHex(Col, 8));
End;
1
2 / 2 / 2
Регистрация: 29.09.2012
Сообщений: 444
11.07.2016, 14:46  [ТС] 3
Спасибо за попытку помочь, но цвета не соответствуют действительности, если этот же пиксель смотреть на текстуре программой ColorPix или ей подобной.
0
590 / 457 / 147
Регистрация: 09.12.2013
Сообщений: 2,385
Записей в блоге: 2
11.07.2016, 18:54 4
У меня соответствуют. Возможно косяк в этой вашей ColorPix?
Что вообще требуется сделать?

Добавлено через 24 секунды
Пример файла?

Добавлено через 3 часа 41 минуту
Цитата Сообщение от Cannon1
Delphi
1
2
3
4
5
6
7
procedure TForm1.Button4Click(Sender: TObject);
begin
Mouse.CursorPos:=ClientToScreen(Point(Image1.Left + 153 ,Image1.Top + 37));
pX:=153;
pY:=37;
Button3Click(nil);
end;
Зачем дважды забивать константы? Один раз присвоить переменной, их и использовать далее.
Нехорошо писать всё в событии кнопки, а потом вызывать таким образом. Плохой стиль. И если уж делать, то не так:
Delphi
1
2
3
4
5
6
7
procedure TForm1.Button4Click(Sender: TObject);
begin
pX:=153;
pY:=37;
Mouse.CursorPos:=ClientToScreen(Point(Image1.Left+pX, Image1.Top+pY));
Button3.Click();
end;
Цитата Сообщение от Cannon1
x153 y37, и курсор переместится на этот пиксель и определит цвет. Рядом у меня открыта программка, которая тоже определяет цвета, и они немного разные, в ColorPix - 8,24,8, а тут 0,17,0 !
На вашем изображении по координатам 153:37 пиксель с цветом ARGB(240, 0, 17, 0).
ColorPix определяет результирующий цвет на экране (после наложения), а не в картинке.

Добавлено через 11 минут
Можете или предварительно удалять альфу или сделать фон на котором будет картинка... точно не помню... белым или чёрным.
1
2 / 2 / 2
Регистрация: 29.09.2012
Сообщений: 444
11.07.2016, 18:54  [ТС] 5
Спасибо, а как Вы определили альфу, покажите пожалуйста код, как ARGB получить?

Не очень понял про результирующий цвет, с чем он результирует? И можно ли получить его цвет ARGB тоже?
0
590 / 457 / 147
Регистрация: 09.12.2013
Сообщений: 2,385
Записей в блоге: 2
11.07.2016, 19:10 6
Он у вас уже получен в коде выше:
Delphi
1
PNG.AlphaScanline[pY][pX]
Можно так как-то:
Delphi
1
2
3
4
If PNG.AlphaScanline[pY]<>Nil Then
      a:=PNG.AlphaScanline[pY][pX]
Else
      a:=255;
Как с чем? Полупрозрачный то и значит что сквозь него "просвечивает" то что находилось сзади.

Просто непонятно что именно требуется. То что вы дополнили в #1 вполне должно работать.
Надо чтоб совпадало с ColorPix - попробуйте сделать то на чём лежит TImage белого или чёрного цвета.
1
2 / 2 / 2
Регистрация: 29.09.2012
Сообщений: 444
11.07.2016, 19:29  [ТС] 7
Подскажите ещё пожалуйста, как убрать альфаканал во всем файле, сделать его 255(непрозрачным), и сохранить в формате PNG ?
0
590 / 457 / 147
Регистрация: 09.12.2013
Сообщений: 2,385
Записей в блоге: 2
11.07.2016, 19:54 8
Так убрать или залить? Убрать например приблизительно так:
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
Procedure TForm1.Button1Click(Sender: TObject);
Var FileName: String; PNG: TPNGObject; BMP: TBitmap;
Begin
FileName:='C:\Users\BOGGART\Downloads\step1.png';
If FileExists(FileName) Then
      Begin
      PNG:=TPNGObject.Create();
      BMP:=TBitmap.Create();
      Try
            PNG.LoadFromFile(FileName);
            BMP.Assign(PNG);
            BMP.PixelFormat:=pf24bit;
            PNG.Assign(BMP);
            PNG.SaveToFile(FileName+'.24bit.png');
      Finally
            PNG.Free();
            BMP.Free();
            End;
      End;
End;
1
590 / 457 / 147
Регистрация: 09.12.2013
Сообщений: 2,385
Записей в блоге: 2
13.07.2016, 17:40 9
Конвертируйте в BMP, работайте с ним и делаете всё что нужно, конвертируйте в PNG.
Или вообще GDI+ использовать.
0
13.07.2016, 17:40
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
13.07.2016, 17:40
Помогаю со студенческими работами здесь

Получить цвет пикселя
Подскажите, как получить цвет пикселя. Везде приводятся такие примеры работы с GetPixel: Bitmap...

Получить цвет пикселя
Всем привет. Как получить цвет пикселя в PictureBox?

Получить цвет пикселя
Имеется указатель на массив битов, полученный, например, функцией GetDIBits. Собственно вопрос: как...

Получить цвет пикселя на форме
Добрый день. Столкнулся не которыми проблемами. Суть такова: есть некий объект на форме который...

Получить цвет пикселя экрана
Собственно по теме... Возникла потребность считать пиксель екрана(точнее его цвет), на java уже...

QBitmap получить цвет пикселя
Какой метод в QBitmap возвращает цвет пикселя(x,y) или возможно существует другой класс, который...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
9
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2023, CyberForum.ru