PureBasic - форум

Информация о пользователе

Привет, Гость! Войдите или зарегистрируйтесь.


Вы здесь » PureBasic - форум » PureBasic для Windows » IconEditor


IconEditor

Сообщений 1 страница 30 из 34

1

IconEditor

Скачать: yandex

Редактор иконок

https://i.imgur.com/tzPFWUR.png

Отредактировано AZJIO (24.01.2025 13:25:57)

0

2

А почему екзешник такой гигантский? 350 килобайт — не слишком ли много только для того, чтобы раскрасить пиксели по щелчку мыши в определённый цвет?

0

3

Замабувараев
Это он еще маленький. Если добавить jpg, tga, tiff вообще запредельный будет. Если для чтения нужен декодер, то для записи нужен енкодер. Убери оба png и скомпилируй, увидишь как он быстро в 100 кб превратится. Gif -15 кб, поэтому я часто иконки в этом формате делаю, чтобы не добавлять к проге размером  70кб декодер png размером 150 кб, декодер больше моей проги получается.

Отредактировано AZJIO (22.11.2023 13:12:16)

0

4

Замабувараев, наверно фильтр подключен

Azjio, есть Dll для вращения, надо?
в качестве недостатка, работает только с РВ

Azjio, а потянешь?
есть не менее 10 готовых иконочников, именно иконочников, а не редакторов

0

5

newJS написал(а):

вращения

У меня пиксели в массиве, а массив я поворачивать умею, в любом случае давай, посмотрю передовые технологии. Кстати могу тон, насыщенность, яркость встроить, только какова будет скорость, как бв не завязнуть в оптимизаторах, если будет работать медленно

0

6

Иконки — это файлы с расширением *.ico. Какие ещё жипеги и пнг?

посмотрю передовые технологии

Умножить вектор на матрицу не такая уж и передовая технология.

0

7

Замабувараев
то есть в png и gif ты никогда иконки не сохранял? И не открывал png чтобы сделать иконку? На сайте значков тебе прям так и дали в ico-формате, в Linux вообще не понимает ico, там иконки в png и векторые, а ico это приблуда винды.

Замабувараев написал(а):

Умножить вектор на матрицу не такая уж и передовая технология.

Вращать ротор векторного поля?

Обновил, теперь есть вращение на 90 градусов вправо/влево и есть регулировка тон/яркость/насыщенность

Отредактировано AZJIO (23.11.2023 00:25:22)

0

8

вращение картинок, 7 фиксированных и на угол 1-359 градусов, пробуй
https://disk.yandex.ru/d/KBMUj9dkoN0Bzw
AZJIO, сразу делай сохранение всего что изменил чел, чтобы прога стартовала в том же положении

Замабувараев, иконочник должен уметь работать с другими форматами, иначе он ни кому не нужен
тоже ico не использую где можно это Г. не использовать

0

9

newJS
случайно не GdipRotateMatrix использует? Просто в AutoIt3 GDI я использовал и переводил, сразу вспомнил про любой угол (_GDIPlus_MatrixRotate).

Отредактировано AZJIO (23.11.2023 03:28:01)

0

10

то есть в png и gif ты никогда иконки не сохранял? И не открывал png чтобы сделать иконку?

А что такое иконки? Если это просто картинка маленького размера, то с такими картинками любой рыдактор умеет работать, даже Пеинт умеет работать с файлами 1x1 пиксель.
А вот если бы программа умел иконки создавать, как заявлено в названии, было бы хорошо.

Вращать ротор векторного поля?

Вы всё усложняете.
В автоматическом режиме устанавливаем матрицу трансляции (поворот, отражение, сдвиг, перенос, масштабирование) в графический контекст и выводим картинку. Это умеет делать даже GDI на Win95.
В ручном режиме перед выводом точки умножаем вектор на матрицу и рисуем точку.

0

11

AZJIO, не, апишная функция PlgBlt_()
ты реально делать собрался или поиграешься и бросишь?
то что я увидел и на детский сад не тянет

0

12

newJS написал(а):

ты реально делать собрался или поиграешься и бросишь?

именно так, если только не увижу какой нибудь функции которой мне не достаёт, а я могу сделать. Обычные бесплатные "IcoFX 1.6", "Greenfish Icon Editor Pro 4.2", "Gimp" с этим справляются выше крыши, в "Gimp" так вообще доступны все возможности полноценного комбайн-редактора. Так что мы можем только поиграться и пристроить это для рисования уровней игры или взять какой нибудь алгоритм для своих целей.

newJS
Мне не нравится иконочные масштабирование и вращение, кроме случая, когда иконка изначально берётся с рисунка размером 500х500 и больше, так как такие манипуляции происходят потерей качества и размытием, а иконки должны быть контрастными. Практически иконку 16х16 чуть ли не попиксельно приходится рисовать, да, сначала масштабируешь форму, о потом видя линии рисуешь свою иконку. Даже просто сдвиг на "пол пикселя" приводит иконку ничтожный результат, поэтому приходилось перед масштабированием крупной иконки несколько раз сдвигать на пиксел, чтобы контрастные линии не попадали на границу пикселя и не расплывались бы на две полу-тусклые линии.

Замабувараев написал(а):

А вот если бы программа умел иконки создавать, как заявлено в названии, было бы хорошо.

Нет времени, есть другие идеи, вам это тоже не нужно, для этого есть редакторы, а если нужно, то вы сами можете дерзать.

Отредактировано AZJIO (23.11.2023 17:23:22)

0

13

Обновление
Добавлен русский язык
Добавлено сохранение настроек
Иконки встроены в исполняемый файл.
Поддержка Dpi (проверка на 125% и 150%)
Кнопка цвета вызывает стандартный диалог выбора цвета.
Перераспределение элементов окна
Добавлено поле ввода и предпросмотра цвета в виде шестнадцатеричных данных

0

14

Нашёл такую функцию SaveIcon и сделал для неё перевод, правда делать я его начал уже после некоторых модификаций, так что снизу не оригинал, я пытался вырезать поддержку курсора, чтобы упростить код и переделать его на работу с изображением, вместо иконки, но пока не получилось, и не знаю получится ли.

Код:
; srod
; https://www.purebasic.fr/english/viewtopic.php?t=23387
!!!уже модернизировал, это не оригинал !!!

; SaveIcon.
; By Stephen Rodriguez 2006 (Обновлено 2010).
; Purebasic 4.5

; Этот небольшой include-файл позволяет сохранить один значок/курсор в файле .ico/.cur.
; Расширение, чтобы включить несколько значков/курсоров в один файл было бы простым.

; СИНТАКСИС: SaveIcon(hIcon, filename$)
; где hIcon — это дескриптор значка/курсора, загруженного из файла ресурсов или с помощью LoadImage_() и т. д.

; ПРИМЕЧАНИЕ.

; i) Эту библиотеку можно использовать только со значками/курсорами, которые уже хранятся в памяти.
; (либо загруженный с диска, либо созданный с помощью CreateIconIndirect_() и т. д.) и
; сохраняет значок/курсор в файл в том же формате (глубина и т. д.), что и хранящийся внутри Windows.

; Однако этот код можно "легко" адаптировать для создания значков/курсоров с нуля,
; используя Purebasic (где изображения хранятся в любом формате), а затем,
; используя адаптированный из этой библиотеки код, сохранять в формат .ico/.cur.
; Это просто вопрос возни с таблицами цветов и т. д.

;   ii) Если вы используете эту библиотеку для сохранения значка/курсора, загруженного с помощью LoadImage_(),
; может показаться, что новый значок/курсор имеет другой размер. Это произойдет потому, что исходный
; файл .ico/.cur содержит несколько значков разных размеров.
; Проводник Windows может сообщать об одном размере, пока вы загружаете другой и т. д.

; TODO (возможно!)
; -Расширьте код, чтобы сохранить несколько значков/курсоров в одном файле .ico.
; -Расширить до файлов .cur курсора (ГОТОВО!)
; **************************************************************************************************


; Результат = ненулевой, если нет ошибок.
Procedure.i SaveIcon(hIcon, filename$)
	Protected result, iconinfo.ICONINFO, hbmMask, hbmColor
	Protected cbitmap.BITMAP, cwidth, cheight, cbitsperpixel, colorcount, colorplanes
	Protected mbitmap.BITMAP, mwidth, mheight
	Protected file, imagebytecount, hdc, oldbitmap, mem, bytesinrow, temp
	Protected *bitmapinfo.BITMAPINFO
	; Получите информацию об иконке.
	If Not GetIconInfo_(hIcon, iconinfo)
    Debug 1
    ProcedureReturn 0
	EndIf ; Недопустимый дескриптор значка.
	; Выделите память для структуры BITMAPINFO + таблицы цветов на 256 записей.
	*bitmapinfo = AllocateMemory(SizeOf(BITMAPINFO) + SizeOf(RGBQUAD) << 8)
	If *bitmapinfo = 0
    ProcedureReturn 0
	EndIf
	; Получите растровое изображение маски (И), которое, если значок черно-белый монохромный, содержит цветное растровое изображение.
	hbmMask = iconinfo\hbmMask
	GetObject_(hbmMask, SizeOf(BITMAP), mbitmap)
	mwidth = mbitmap\bmWidth
	mheight = mbitmap\bmHeight
	; Получите цвет (XOR) bitmap.
	hbmColor = iconinfo\hbmColor
	If hbmColor
    GetObject_(hbmColor, SizeOf(BITMAP), cbitmap)
    cwidth = cbitmap\bmWidth
    cheight = cbitmap\bmHeight
    cbitsperpixel = cbitmap\bmBitsPixel
    If cbitsperpixel = 0
    	cbitsperpixel = 1
    EndIf
    If cbitsperpixel < 8
    	colorcount = Pow(2, cbitsperpixel) ; colorcount = 0, если 8 или более бит на пиксель (bpp).
    EndIf
    colorplanes = cbitmap\bmplanes
	Else ; Монохромный значок (2 цвета, чёрный и белый или другие, то есть 0 и 1).
    cwidth = mwidth
    cheight = mheight / 2
    cbitsperpixel = 1
    colorcount = 2
    colorplanes = 1
    mheight = cheight
	EndIf
	; Все готово для создания файла.
	file = CreateFile(#PB_Any, filename$)
	If file
    ; Записывает данные.
    ; word = 0
    WriteWord(file, 0) ; (резервный)
    ; word = 1 для значка, 2 для курсора.
    WriteWord(file, 1) ; (тип) 1 - значок, 2 - курсор.
            	  ; word = количество иконок в файле.
    WriteWord(file, 1)   ; (число иконок) ***ИЗМЕНИТЕ ЕСЛИ КОД ПОДДЕРЖИВАЕТ БОЛЬШЕЕ ЧИСЛО ЗНАЧКОВ***
            	  ; 16-байтовая структура ICONDIRENTRY, по одному на каждый значок.
    WriteByte(file, cwidth) ; ширина
    WriteByte(file, cheight) ; высота
    WriteByte(file, colorcount) ; цветов в палитре
    WriteByte(file, 0) ; резервный .
;     If ficon = 1     ; иконка.
    	WriteWord(file, colorplanes) ; (число плоскостей: 0 или 1) Должно быть равно 1, - но на всякий случай!
    	WriteWord(file, cbitsperpixel) ; bpp - бит на пиксель
;     EndIf
    WriteLong(file, 0) ; (размер растра, см FileSeek на 14 далее) ВРЕМЕННО! НАМ НУЖНО ВЕРНУТЬ, КОГДА МЫ ЗНАЕМ ТОЧНОЕ КОЛИЧЕСТВО.
              ;  Размер (InfoHeader + ANDbitmap + XORbitmap)
    WriteLong(file, Loc(file) + 4)  ; (позиция BITMAPINFOHEADER) FilePos, где начинается InfoHeader
                    ; Теперь данные изображения в виде BITMAPINFOHEADER (40 байт) + карта цветов для цветового растрового изображения.
                    ; + биты цветного растрового изображения + биты растрового изображения маски. Глоток! По одному на каждую иконку.
                    ; 40-байтовая структура BITMAPINFOHEADER.
    imagebytecount = SizeOf(BITMAPINFOHEADER)
    WriteLong(file, imagebytecount) ; Should be 40.
    WriteLong(file, cwidth)
    WriteLong(file, cheight + mheight) ; Комбинированные высоты цвета + изображения маски.
    WriteWord(file, colorplanes)  ; Должно быть равно 1, - но на всякий случай!
    WriteWord(file, cbitsperpixel)
    WriteLong(file, 0) ; Сжатие.
    WriteLong(file, 0) ; Размер изображения. Допустимо установить нулевое значение, если сжатие отсутствует.
    WriteLong(file, 0) ; Неиспользуется.
    WriteLong(file, 0) ; Неиспользуется.
    WriteLong(file, 0) ; Неиспользуется.
    WriteLong(file, 0) ; Неиспользуется.
               ; Цветовая карта. Применяется только для <= 8 бит на пиксель.
    hdc = CreateCompatibleDC_(0) ; Нужен для того, чтобы получить таблицу цветов.
    If hbmColor = 0      ; Монохромный значок.
    	WriteLong(file, #Black)
    	WriteLong(file, #White)
    	imagebytecount + SizeOf(rgbquad) * 2
    ElseIf cbitsperpixel <= 8 ; Включает 1-битные немонохромные значки.
                ; Получите таблицу цветов.
    	temp = Pow(2, cbitsperpixel)
    	bytesinrow = SizeOf(rgbquad) * temp
    	mem = AllocateMemory(bytesinrow)
    	oldbitmap = SelectObject_(hdc, hbmColor)
    	GetDIBColorTable_(hdc, 0, temp, mem)
    	WriteData(file, mem, bytesinrow) ; Напишите таблицу цветов.
    	FreeMemory(mem)
    	SelectObject_(hdc, oldbitmap)
    	imagebytecount + bytesinrow
    EndIf
    ; Теперь биты цветного изображения. Для этого мы используем GetDiBits_().
    bytesinrow = (cwidth * cbitsperpixel + 31) / 32 * 4  ; Выровнено по границе 4 байта.
    bytesinrow * cheight
    mem = AllocateMemory(bytesinrow)
    *bitmapinfo\bmiHeader\biSize = SizeOf(BITMAPINFOHEADER)
    *bitmapinfo\bmiHeader\biWidth = cwidth
    *bitmapinfo\bmiHeader\biPlanes = colorplanes
    *bitmapinfo\bmiHeader\biBitCount = cbitsperpixel
    If hbmColor
    	*bitmapinfo\bmiHeader\biHeight = cheight
    	GetDIBits_(hdc, hbmColor, 0, cheight, mem, *bitmapinfo, #DIB_RGB_COLORS)
    Else ; Монохромное цветное изображение — это нижняя половина изображения маски.
    	*bitmapinfo\bmiHeader\biHeight = 2*cheight
    	GetDIBits_(hdc, hbmMask, 0, cheight, mem, *bitmapinfo, #DIB_RGB_COLORS)
    EndIf
    WriteData(file, mem, bytesinrow)
    FreeMemory(mem)
    imagebytecount + bytesinrow
    ; Теперь биты изображения маски. Для этого мы используем GetDiBits_().
    bytesinrow = (mwidth + 31) / 32 * 4  ; Выровнено по границе 4 байта.
    bytesinrow * mheight
    mem = AllocateMemory(bytesinrow)
    *bitmapinfo\bmiHeader\biWidth = mwidth
    *bitmapinfo\bmiHeader\biPlanes = 1
    *bitmapinfo\bmiHeader\biBitCount = 1
    If hbmColor
    	*bitmapinfo\bmiHeader\biHeight = mheight
    	GetDIBits_(hdc, hbmMask, 0, mheight, mem, *bitmapinfo, #DIB_RGB_COLORS)
    Else
    	*bitmapinfo\bmiHeader\biHeight = 2*mheight
    	GetDIBits_(hdc, hbmMask, mheight, mheight, mem, *bitmapinfo, #DIB_RGB_COLORS)
    EndIf
    WriteData(file, mem, bytesinrow)
    FreeMemory(mem)
    imagebytecount + bytesinrow
    DeleteDC_(hdc)
    ; Наконец, возвращение на поле, которое мы пропустили.
    FileSeek(file, 14)
    WriteLong(file, imagebytecount)
    CloseFile(file)
    result = 1 ; Сигнал, что все в порядке.
	Else
    result = 0
	EndIf
	DeleteObject_(hbmMask) ; Это копии, созданные в результате GetIconInfo_(), и поэтому их необходимо удалить.
	DeleteObject_(hbmColor)
	FreeMemory(*bitmapinfo)
	ProcedureReturn result
EndProcedure

0

15

у меня такой код есть, скорей всего оригинал
может что поимеешь

Код:
; German forum:
; Author: PureFan 
; Date: 23. March 2003
; OS: Windows
; Demo: Yes

;"--------------------------------------------------------------------- 
;             Bilder als *.ICO und *.CUR - Datei abspeichern 
;"--------------------------------------------------------------------- 

;Verwenden sie diese Variable, wenn sie keine transparenz verwenden wollen! 
;Global NoTransparent 
PokeB(@NoTransparent.l+3,1) 

;Schreibt ein Byte (0-255) in die aktuell geцffnete Datei 
Procedure.l WriteByte2(val.l) 
  WriteData(@val,1) 
EndProcedure 


;Speichert das Bild, auf dem gerade gezeichnet wird, in einer *.ICO 
;(HotspotX und HotspotY muss 0 sein!) oder in einer *.CUR-Datei! 
Procedure.l SaveIcon(FileName.s,TransparentColor.l,HotspotX.l,HotspotY.l) 

  ;Der Hotspot muss sich innerhalb des Bildes befinden! 
  If HotspotX>32:HotspotX=32:ElseIf HotspotX<0:HotspotX=0:EndIf 
  If HotspotY>32:HotspotY=32:ElseIf HotspotY<0:HotspotY=0:EndIf 
  
  ;Цffnet die Datei  
  If CreateFile(0,FileName)=0 
    ProcedureReturn 0 
  EndIf 
  
  ;Schreibt zuerst den HEADER fьr eine 32x32 Pixel groЯe ICO-Datei 
  Restore ICON_HEADER_256_COLORS 
  For I=1 To 62 
    Read ThisValue 
    If I=$B 
      WriteByte2(HotspotX) 
    ElseIf I=$D 
      WriteByte2(HotspotY) 
    Else 
      WriteByte2(ThisValue) 
    EndIf 
  Next I 
  
  ;Erstellt eine Palette mit 256 Farben 
  Dim UsedColors.l(255) 
  UsedColors(0)=RGB(0,0,0) 
  UsedColorCnt.l=1 
  For Y=31 To 0 Step -1 
    For X=0 To 31 Step 1 
      Farbe.l=Point(X,Y) 
      AddToList.l=1 
      For I=0 To UsedColorCnt 
        If Farbe=UsedColors(I) 
          AddToList=0 
          I=UsedColorCnt 
        EndIf 
      Next I 
      If UsedColorCnt=255 And AddToList 
        MIN_I=1 
        MIN_DIF=0 
        For I=1 To UsedColorCnt 
          If Abs(Farbe-UsedColors(I))<MIN_DIF Or I=1 
            MIN_I=I 
            MIN_DIF=Abs(Farbe-UsedColors(I)) 
          EndIf 
        Next I 
        NEW_RED=(Red(Farbe)+Red(UsedColors(MIN_I)))/2 
        NEW_GREEN=(Green(Farbe)+Green(UsedColors(MIN_I)))/2 
        NEW_BLUE=(Blue(Farbe)+Blue(UsedColors(MIN_I)))/2 
        UsedColors(MIN_I)=RGB(NEW_RED,NEW_GREEN,NEW_BLUE) 
      ElseIf UsedColorCnt<>255 And AddToList 
        UsedColors(UsedColorCnt)=Farbe 
        UsedColorCnt+1 
      EndIf 
    Next X 
  Next Y 
  
  ;Schreibt die Palette in die Datei 
  For I=0 To UsedColorCnt 
    WriteByte(Blue(UsedColors(I))) 
    WriteByte(Green(UsedColors(I))) 
    WriteByte(Red(UsedColors(I))) 
    WriteByte(0) 
  Next I 
  
  ;Fьr alle freien Eintrдge wird die Farbe SCHWARZ eingefьgt 
  For I=UsedColorCnt+1 To 255 
    WriteLong(0) 
  Next I 
  
  ;Schreibt das Bild in die Datei 
  For Y=31 To 0 Step -1 
    For X=0 To 31 Step 1 
      Farbe.l=Point(X,Y) 
      If Farbe<>TransparentColor 
        MIN_I=0 
        For I=0 To UsedColorCnt 
          If Abs(Farbe-UsedColors(I))<MIN_DIF Or I=0 
            MIN_I=I 
            MIN_DIF=Abs(Farbe-UsedColors(I)) 
          EndIf 
        Next I  
        Farbe=MIN_I      
      Else 
        Farbe=0 
      EndIf 
      WriteByte2(Farbe) 
    Next X 
  Next Y 
  
  ;Schreibt am Ende eine Liste, damit der Computer weiЯ, welche Pixel transparent sind 
  For Y=31 To 0 Step -1 
    For X=0 To 31 Step 8 
      LastByte.l=0 
      For I=0 To 7 
        Farbe.l=Point(X+I,Y) 
        If Farbe=TransparentColor 
          Select I 
            Case 7:OrVal=1 
            Case 6:OrVal=2 
            Case 5:OrVal=4 
            Case 4:OrVal=8 
            Case 3:OrVal=16 
            Case 2:OrVal=32 
            Case 1:OrVal=64 
            Case 0:OrVal=128 
          EndSelect 
          LastByte|OrVal 
        EndIf 
      Next I 
      WriteByte2(LastByte) 
    Next X 
  Next Y 
  
  ;Fertig! SchlieЯt die Datei 
  CloseFile(0) 
  ProcedureReturn 1 
  
  ;Der HEADER fьr eine ICO-Datei 
  DataSection 
  ICON_HEADER_256_COLORS: 
    Data.l $00,$00,$01,$00,$01,$00,$20,$20,$00,$00,$00,$00,$00,$00,$A8,$08 
    Data.l $00,$00,$16,$00,$00,$00,$28,$00,$00,$00,$20,$00,$00,$00,$40,$00 
    Data.l $00,$00,$01,$00,$08,$00,$00,$00,$00,$00,$80,$04,$00,$00,$00,$00 
    Data.l $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00 
  EndDataSection 

EndProcedure 




;"--------------------------------------------------------------------- 
;                                 BEISPIEL 
;"--------------------------------------------------------------------- 

MessageRequester("Bmp2Ico","Bitte wдhlen sie im folgenden Dialog das Bitmap aus, das in eine Ico umgewandelt werden soll!",0) 

BmpDatei.s=OpenFileRequester("BMP-Datei цffnen","","Bitmaps|*.bmp",0) 

If BmpDatei="" 
  End 
EndIf 

IcoDatei.s=SaveFileRequester("Speichern als ICO-Datei","","Icons|*.ico",0) 

If IcoDatei="" 
  End 
EndIf 

If LoadImage(0,BmpDatei)=0 
  MessageRequester("Fehler!","Ungьltiges Dateiformat!",0) 
EndIf 

StartDrawing(ImageOutput()) 

SaveIcon(IcoDatei,NoTransparent,0,0)  ;Ico-Dateien haben keinen Hotspot 

StopDrawing() 

MessageRequester("Info!","Datei erfolgreich abgespeichert!",0) 
; ExecutableFormat=Windows
; FirstLine=1
; EOF

0

16

newJS
мне дали идеальные функции сохранения в иконку, но я пока не добавлял.

Интересный алгоритм заполнения при заливке ведром/банкой. Проверяется близ лежащие пикселы в рекурсии, но я подумал, зачем проверять 4 направления, если с одного из направлений делается как бы вход, то есть если слева от пиксела нужный для заливки квадрат, то вызывается повтор для обследования пискелов вокруг этого пиксела, но если мы пришли слева, то левый пиксел можно не проверять. В итоге вместо 4 направлений проверяется 3 и снижение задач на 25% ну и быстрей соответственно на 25%. Этот же алгоритм используется в CubePicker, потом он перешёл в IconEditor сейчас в BallBrick для взрывающихся. Поэтому я и хотел сделать оптимизацию, так как в CubePicker это используется при наведении мыши, то есть очень быстро, в IconEditor залить  иконку 48х48=2304 это пробежаться по 2 тыс. пикселам, а в BallBrick за 1/60 сек взорвать кирпичи - вычислить близлежащие. Но в CubePicker я ещё не встроил эту оптимизацию. В связи с этим интересно как это делается в FillArea(). Как вариант попробовать сделать копию изображения в image и залить с помощью FillArea(), а потом попиксельно вернуть обратно в массив.

0

17

Обновлено
1. Добавлена поддержка ico, причём на линукс тоже работает.
2. Добавлены пункты "Обесцветить", "Инвертировать", "Сдвиг", "Изменить размер".
3. Для Windows добавлен пункт "Захватить с экрана"

0

18

Хорошо бы добавить команду замены цвета. И я не увидел отображения прозрачного цвета. Редактор написан только под одно разрешение картинки, или поддерживает разные?

0

19

egons написал(а):

не увидел отображения прозрачного цвета

С прозрачным проблема,  канвас не работает с прозрачным фоном, а значит надо как в bmp какой то цвет назначить прозрачным и при сохранении формируя изображение не заполнять точки являющиеся назначенным прозрачным цветом. Но проблема, когда я это хотел провернуть код выдаёт ошибку. Векторная графика поддерживает прозрачность, но я не могу вставить изображение.

egons написал(а):

Хорошо бы добавить команду замены цвета.

Типа как заливка только в том числе и для не соприкасающихся областей.

egons написал(а):

Редактор написан только под одно разрешение картинки, или поддерживает разные?

Не делает пакетную иконку. Комбайн мне пока трудно написать, хоть я и не вижу проблемы. Это как вкладки, можно написать открытия файлов вкладками и добавить вкладки для изображений разных разрешений, а при сохранении прочитать их все и сохранить в файл. Если один читается то и три прочитаются, далее число не имеет значения.
Если дальше рассуждать, то можно центрировать канвас и  добавить изменение размера, при этом меняется размер ячейки, опять не сложно.
Главное во всей этой катавасии не запутаться, ведь будет введено множество переменных - список структур для файлов, на каждый файл список структур для числа иконок в файле, а при сохранении обрабатывать список списков. Учитывая что я лишь повторю бесплатную версию ArtIcons, не дотягивая до его функционала.
Я также думал о выделении, внеся клики мыши и рисуя муравьиный контур вокруг выделенных квадратов, и при Ctrl+C создаю массив выделенных ячеек, далее движок перетаскивания формирует изображение, которое можно таскать по канвасу с возможностью отпустить в любом месте и "сохранить на площади канваса". В общем ага, мечтать не вредно, всегда легче чем написать тонну кода.

Я понял как интерпретировать прозрачный цвет. Надо просто сделать шахматную доску и если ячейка содержит 2 цвета в одной ячейке, то интерпретировать его как прозрачный, настолько это просто.

Отредактировано AZJIO (26.01.2025 01:34:50)

0

20

AZJIO написал(а):

С прозрачным проблема,  канвас не работает с прозрачным фоном

Можно рисовать на 32-ух битной картинке и отображать в ImageGadget, а Canvas использовать только для событий.

Код:
If OpenWindow(0, 0, 0, 220, 220, "Гаджет Канвас (Холст)", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
  SmartWindowRefresh(0, 1)
  CanvasGadget(0, 10, 10, 200, 200, #PB_Canvas_Container)
  CreateImage(0, GadgetWidth(0), GadgetHeight(0), 32, #PB_Image_Transparent)
  ImageGadget(1, 0, 0, GadgetWidth(0), GadgetHeight(0), ImageID(0))
  DisableGadget(1, 1)
  CloseGadgetList()
  
  Repeat
    Event = WaitWindowEvent()   
    If Event = #PB_Event_Gadget And EventGadget() = 0 
      If EventType() = #PB_EventType_LeftButtonDown Or (EventType() = #PB_EventType_MouseMove And GetGadgetAttribute(0, #PB_Canvas_Buttons) & #PB_Canvas_LeftButton)
        If StartDrawing(ImageOutput(0))
          DrawingMode(#PB_2DDrawing_AllChannels)
          x = GetGadgetAttribute(0, #PB_Canvas_MouseX)
          y = GetGadgetAttribute(0, #PB_Canvas_MouseY)
          Circle(x, y, 10, RGBA(Random(255), Random(255), Random(255), 255))
          StopDrawing()
          SetGadgetState(1, ImageID(0))
        EndIf
      EndIf
    EndIf    
  Until Event = #PB_Event_CloseWindow
EndIf

0

21

Пётр
По сути мне и рисовать то на ImageGadget() не нужно. Я при сохранении создаю изображение

Код:
CreateImage(#Image, XXX, YYY, 32, #PB_Image_Transparent)

считываю на него пикселы с канваса и сохраняю.

Вот тут, если цвет #Transparency (это как в bmp лиловый), то используется цвет RGBA(0,0,0,0), то есть чёрный прозрачный.

Код:
For y = 1 To YYY
	For x = 1 To XXX
    If aPicturePx(x, y) <> #Transparency
    	Plot(x - 1, y - 1, aPicturePx(x, y))
    Else
    	Plot(x - 1, y - 1, RGBA(0,0,0,0))
    EndIf
	Next
Next

Но при сохранении я получаю сломанную иконку, потом при открытии в ArtIcons он предлагает её исправить, да и в проводнике иконка видно что поломана.
Автор функции CreateIconFile() idle открывает иконку из файла, она уже имеет не поломанную прозрачность. Также он использует пример из векторной графики, который имеет прозрачность. Это я отписал уже на официальном форуме. Но я не могу нарисовать используя векторную графику, там нет точки, а если взять линию, боюсь она не будет точкой, а размытым пятном.

0

22

https://forumupload.ru/uploads/0009/ae/28/618/t587583.png
Примерно вот так выглядит редактор иконок.

0

23

AZJIO написал(а):

Типа как заливка только в том числе и для не соприкасающихся областей.

Нет, только замена цвета на выбранный.

0

24

egons написал(а):

Примерно вот так выглядит редактор иконок.

Ну это и есть ArtIcons, о котором я говорил.

egons написал(а):

Нет, только замена цвета на выбранный.

Одно и тоже просто название другое.

0

25

AZJIO написал(а):

Ну это и есть ArtIcons, о котором я говорил.

Это IconXP/Aha-Soft.  Немного похож на редактор иконок Sibsoft, но глючки те же.

AZJIO написал(а):

Одно и тоже просто название другое.

Заливка не замена. В некоторых редакторах указывается цвет, который нужно заменить на выбранный цвет и это выполняется без заливки.

0

26

egons написал(а):

IconXP/Aha-Soft.

они одну и туже прогу выпустили в разных вариациях с небольшими изменениями. Есть новогодняя акция - бесплатная версия с их же сайта

0

27

AZJIO написал(а):

Есть новогодняя акция - бесплатная версия с их же сайта

Что-то мне говорит, что это ненадолго.

0

28

egons написал(а):

Что-то мне говорит, что это ненадолго.

С 2019 года там лежит, это недолго? ссылка

0

29

AZJIO написал(а):

С 2019 года там лежит, это недолго? ссылка

Раньше не видел таких акций, но сталкивался с тем, что программа ругается на серийник и не регится.
В общем, скачал, запустил - прога уже зарегистрирована(: Наверное, раньше вводил код. Один из глюков все-же устранен и это радует. Может, пересяду на новую версию.

0

30

egons написал(а):

Может, пересяду на новую версию

Ну ещё рассмотри вариант "Greenfish Icon Editor Pro". Бесплатная, много возможноестей, может даже получше чем ArtIcons, но не такая компактная и аскетичная, для мелочей проще ArtIcons.

0


Вы здесь » PureBasic - форум » PureBasic для Windows » IconEditor