purebasic.info

PureBasic forum
Текущее время: Ср май 23, 2018 6:16 am

Часовой пояс: UTC + 3 часа




Начать новую тему Ответить на тему  [ Сообщений: 13 ] 
Автор Сообщение
 Заголовок сообщения: Буфер обмена
СообщениеДобавлено: Вт янв 09, 2018 6:00 am 
Не в сети
профессор

Зарегистрирован: Вт май 13, 2014 4:12 am
Сообщений: 603
Благодарил (а): 66 раз.
Поблагодарили: 20 раз.
Пункты репутации: 5
Почему прозрачная картинка уходит в буфер с чёрным фоном, сохраняется в файл правильно.


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: Буфер обмена
СообщениеДобавлено: Вт янв 09, 2018 2:15 pm 
Не в сети
профессор

Зарегистрирован: Пт фев 20, 2009 12:57 pm
Сообщений: 1610
Откуда: Алматы
Благодарил (а): 13 раз.
Поблагодарили: 43 раз.
Пункты репутации: 5
а разве она сохраняется не как битмап изображение? то есть без прозрачного альфа канала?

я в своем редакторе делал прозрачным фиолетовый. то есть в пейнте скажем что-то нарисовано, копирую в нем, вставляю в своем редакторе - фиолетовый заменяется на прозрачный.


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: Буфер обмена
СообщениеДобавлено: Ср янв 10, 2018 7:16 am 
Не в сети
профессор

Зарегистрирован: Вт май 13, 2014 4:12 am
Сообщений: 603
Благодарил (а): 66 раз.
Поблагодарили: 20 раз.
Пункты репутации: 5
SereZa писал(а):
а разве она сохраняется не как битмап изображение? то есть без прозрачного альфа канала?

так в PNG сохраняется, а не в BMP
чужая картинка, GIF, ICO, PNG, читается с прозрачностью, редактируется и сохраняется с прозрачностью в PNG.
своя картинка создаётся с прозрачностью и сохраняется с прозрачностью в PNG.
а в буфер уходит с чёрным фоном, любой чужой редактор получает из буфера картинку с чёрным фоном вместо прозрачности.
я так понимаю, картинка создаются с чёрным фоном и в буфер уходит не как 32 бита, а как 24 бита, константа прозрачности игнорится, возможно это очередная дырка в РВ
а может надо буфер через АPI настраивать, но для меня это тёмный лес

SereZa писал(а):
я в своем редакторе делал прозрачным фиолетовый.

как?


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: Буфер обмена
СообщениеДобавлено: Ср янв 10, 2018 9:06 am 
Не в сети
профессор
Аватар пользователя

Зарегистрирован: Вс дек 09, 2012 9:02 pm
Сообщений: 771
Откуда: Дагестан
Благодарил (а): 0 раз.
Поблагодарили: 11 раз.
Пункты репутации: 0
newJS писал(а):
Почему прозрачная картинка уходит в буфер с чёрным фоном, сохраняется в файл правильно.

А почему ты так решил?


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: Буфер обмена
СообщениеДобавлено: Ср янв 10, 2018 1:15 pm 
Не в сети
профессор
Аватар пользователя

Зарегистрирован: Чт июн 25, 2009 1:02 pm
Сообщений: 2271
Откуда: Russia — Belarus
Благодарил (а): 5 раз.
Поблагодарили: 71 раз.
Пункты репутации: 11
Внутри PB работает. Однако если вставлять в граф. редакторы, то нет.
Код:
1
2
3
4
5
6
7
8
9
10
11
12
13
UsePNGImageDecoder()
UsePNGImageEncoder()
 
#img = 0
 
If LoadImage(#img, "D:\png.png")
  If ImageDepth(#img) = 32
    SetClipboardImage(#img)
    GetClipboardImage(#img, 32)
    SaveImage(#img, "D:\png2.png", #PB_ImagePlugin_PNG)
  EndIf
  FreeImage(#img)
EndIf


_________________
EnableExplicit User


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: Буфер обмена
СообщениеДобавлено: Ср янв 10, 2018 3:16 pm 
Не в сети
профессор

Зарегистрирован: Пт фев 20, 2009 12:57 pm
Сообщений: 1610
Откуда: Алматы
Благодарил (а): 13 раз.
Поблагодарили: 43 раз.
Пункты репутации: 5
newJS писал(а):
как?

понятия не имею как это работает :) я просто взял и использую:

Код:
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
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
;{ прозрачный цвет для вставки из буфера обмена
Procedure ByteSwap32(addrLong)
  CompilerIf #PB_Compiler_Processor = #PB_Processor_x64
    !mov rax, [p.v_addrLong]
    !mov ecx, [rax]
    !bswap ecx
    !mov [rax], ecx
  CompilerElse
    !mov eax, [p.v_addrLong]
    !mov ecx, [eax]
    !bswap ecx
    !mov [eax], ecx
  CompilerEndIf
EndProcedure
 
Procedure.i LoadImageTransparent(hLoadImg, TransparentColorRGB.l)   ;returns new image handle
  Protected width,height,pitch,imgbase, x,y, hImg32, *RGBA.Long
  width = ImageWidth(hLoadImg)
  height = ImageHeight(hLoadImg)
  hImg32 = CreateImage(#PB_Any, width, height, 32)
  If hImg32 = 0: ProcedureReturn 0: EndIf  
  If StartDrawing(ImageOutput(hImg32)) = 0
    FreeImage(hImg32):   ProcedureReturn 0
  EndIf  
  If DrawingBufferPixelFormat() & #PB_PixelFormat_32Bits_RGB
    TransparentColorRGB | $FF000000    ;Linux & OSX
  Else
    ByteSwap32(@TransparentColorRGB)   ;Windows
    TransparentColorRGB = (TransparentColorRGB >> 8) | $FF000000
  EndIf  
  DrawingMode(#PB_2DDrawing_Default)
  DrawImage(ImageID(hLoadImg),0,0,width,height)
  pitch = DrawingBufferPitch()
  imgbase = DrawingBuffer()
  width-1: height-1  ;to address from base 0
  For y = 0 To height
    *RGBA = imgbase + (y * pitch)
    For x = 0 To width
      If *RGBA\l = TransparentColorRGB
        *RGBA\l = 0  ;= RGBA(0,0,0, 0) ;set Alpha channel to 0 (fully transparent)
      EndIf
      *RGBA+4
    Next x
  Next y
  StopDrawing()  
  ProcedureReturn hImg32
EndProcedure
 
Procedure SetImageTransparent (hImg32, TransparentColorRGB.l)    ;returns 1 on success, 0 on error/fail
  Protected width,height,pitch,imgbase, x,y, *RGBA.Long
  If ImageDepth(hImg32) <> 32: ProcedureReturn 0: EndIf
  width = ImageWidth(hImg32)
  height = ImageHeight(hImg32)
  If StartDrawing(ImageOutput(hImg32)) = 0
    ProcedureReturn 0
  EndIf  
  If DrawingBufferPixelFormat() & #PB_PixelFormat_32Bits_RGB
    TransparentColorRGB | $FF000000    ;Linux & OSX
  Else
    ByteSwap32(@TransparentColorRGB)   ;Windows
    TransparentColorRGB = (TransparentColorRGB >> 8) | $FF000000
  EndIf  
  DrawingMode(#PB_2DDrawing_Default)
  pitch = DrawingBufferPitch()
  imgbase = DrawingBuffer()  
  width-1: height-1
  For y = 0 To height
    *RGBA = imgbase + (y * pitch)
    For x = 0 To width
      If *RGBA\l = TransparentColorRGB
        *RGBA\l = 0  ;= RGBA(0,0,0, 0) ;set Alpha channel to 0 (fully transparent)
      EndIf
      *RGBA+4
    Next x
  Next y
  StopDrawing()  
  ProcedureReturn 1 ;SUCCESS
EndProcedure
;}



Код:
1
2
3
If GetClipboardImage(#IcEdClipBoardImg, 32)
  SetImageTransparent(#IcEdClipBoardImg, RGB(забылкакойтамрозовый))
Endif



Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: Буфер обмена
СообщениеДобавлено: Чт янв 11, 2018 3:43 am 
Не в сети
профессор

Зарегистрирован: Вт май 13, 2014 4:12 am
Сообщений: 603
Благодарил (а): 66 раз.
Поблагодарили: 20 раз.
Пункты репутации: 5
mestnyi писал(а):
А почему ты так решил?

потому что проверял, и товарищЪ Фантомас это подтверждает
qpAHToMAS писал(а):
Внутри PB работает. Однако если вставлять в граф. редакторы, то нет.

про это и спрашивю
как то же редакторы между собой обмениваются через буфер
SereZa писал(а):
понятия не имею как это работает :) я просто взял и использую:

хороший монстр :D , попробую


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: Буфер обмена
СообщениеДобавлено: Чт янв 11, 2018 4:45 pm 
Не в сети
профессор
Аватар пользователя

Зарегистрирован: Чт июн 25, 2009 1:02 pm
Сообщений: 2271
Откуда: Russia — Belarus
Благодарил (а): 5 раз.
Поблагодарили: 71 раз.
Пункты репутации: 11
Цитата:
как то же редакторы между собой обмениваются через буфер

Да даже тут не всё так гладко. Взять тот же Photoshop и Paint, передать картинку с альфой из одного в другой через Clipboard не получится.
Зависит от поставленной задачи. Если из твоей программы надо вставлять в Photoshop, то надо копировать из него и изучать буфер через какой-нибудь Windows Clipboard Data Viewer.

_________________
EnableExplicit User


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: Буфер обмена
СообщениеДобавлено: Чт янв 11, 2018 4:58 pm 
Не в сети
профессор
Аватар пользователя

Зарегистрирован: Чт июн 25, 2009 1:02 pm
Сообщений: 2271
Откуда: Russia — Belarus
Благодарил (а): 5 раз.
Поблагодарили: 71 раз.
Пункты репутации: 11
Во:
http://www.freeclipboardviewer.com/

Там помимо самого BITMAP'а еще куча информации.

_________________
EnableExplicit User


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: Буфер обмена
СообщениеДобавлено: Пт янв 12, 2018 7:16 am 
Не в сети
профессор

Зарегистрирован: Вт май 13, 2014 4:12 am
Сообщений: 603
Благодарил (а): 66 раз.
Поблагодарили: 20 раз.
Пункты репутации: 5
про это знаю, только не понимаю как всем этим воспользоваться
я себе этот сайт на винт скачал vsokovikov.narod.ru, там много чего написано, только непонятно, хотя и по русски, терминология жуткая


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: Буфер обмена
СообщениеДобавлено: Пт янв 12, 2018 3:27 pm 
Не в сети
профессор

Зарегистрирован: Пт фев 20, 2009 12:57 pm
Сообщений: 1610
Откуда: Алматы
Благодарил (а): 13 раз.
Поблагодарили: 43 раз.
Пункты репутации: 5
при любой непонятной ситуации - спроси Петра :)))) он все знает :)


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: Буфер обмена
СообщениеДобавлено: Сб янв 13, 2018 8:04 am 
Не в сети
профессор

Зарегистрирован: Вт май 13, 2014 4:12 am
Сообщений: 603
Благодарил (а): 66 раз.
Поблагодарили: 20 раз.
Пункты репутации: 5
SereZa писал(а):
при любой непонятной ситуации - спроси Петра :)))) он все знает :)

знать то он знает, но молчит


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: Буфер обмена
СообщениеДобавлено: Пн фев 12, 2018 5:53 am 
Не в сети
профессор

Зарегистрирован: Вт май 13, 2014 4:12 am
Сообщений: 603
Благодарил (а): 66 раз.
Поблагодарили: 20 раз.
Пункты репутации: 5
здесь при вылете останется драйвинг не закрытым, надо закрыть
Код:
1
2
3
If StartDrawing(ImageOutput(hImg32)) = 0
    FreeImage(hImg32):   ProcedureReturn 0
  EndIf



закрываем
Код:
1
2
3
4
5
6
7
8
 
; иначе сворачивание через жопу работает
Macro StopDrawingMacro:StopDrawing():EndMacro
 
 If StartDrawing(ImageOutput(hImg32)) = 0
        FreeImage(hImg32): StopDrawingMacro: ProcedureReturn 0
      EndIf
 


то же и во второй функции


Вернуться наверх
 Профиль  
 
Показать сообщения за:  Сортировать по:  
Начать новую тему Ответить на тему  [ Сообщений: 13 ] 

Часовой пояс: UTC + 3 часа


Кто сейчас на форуме

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 5


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  
cron
Создано на основе phpBB® Forum Software © phpBB Group (блог о phpBB)
Сборка создана CMSart Studio
Русская поддержка phpBB