purebasic.info

PureBasic forum
Текущее время: Ср ноя 21, 2018 9:36 pm

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




Начать новую тему Ответить на тему  [ Сообщений: 155 ]  На страницу Пред.  1 ... 7, 8, 9, 10, 11  След.
Автор Сообщение
 Заголовок сообщения: Re: Работа с изображениями
СообщениеДобавлено: Вс авг 05, 2018 8:31 pm 
Не в сети
профессор

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

так-то в принципе все понятно. я как раз такое-же делаю для Дюны на Сегу. 4 битная графика у меня. то есть цвета от 0 до 15. в одном байте по 2 пикселя. содержит в себе номер цвета.

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

лайфхак: возьми хекс редактор и в настройках там вбей... эээ... 20 пикселов в ширину, значит 10 байт. вот 10 вбей и будет виден силуэт твоего изображения :) из которого будет понятно что 0 это черный, $F - это белый. дальше уже методом тыка можно будет воссоздать файл палитры. без файла палитры грош цена такой графике. ведь система не будет знать какому номеру цвета какой цвет соответствует. и отрисовать соответственно не сможет.


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: Работа с изображениями
СообщениеДобавлено: Вс авг 05, 2018 8:38 pm 
Не в сети
док
Аватар пользователя

Зарегистрирован: Сб мар 28, 2015 11:06 pm
Сообщений: 159
Откуда: Україна
Благодарил (а): 11 раз.
Поблагодарили: 11 раз.
Пункты репутации: 4
SereZa, палитры нет и цвета тоже (это шрифт, 16градаций с головой). Пиксели по порядку...
вот я и не знаю как из одного байта два пикселя "взять"..
накостылял такой вариант, но чтото не так
Код:
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
If OpenWindow(0, 100, 100, 300, 300, "PureBasic - Image")
 
  ReadFile(0, "example_20x27.bin", #PB_File_SharedRead)
  imgW = 20
  imgH = 27
  DataSize = imgW * imgH / 2
 
 
  *Buffer = AllocateMemory(DataSize * 2)
  Debug *Buffer
  offset = 0
  For x = 0 To DataSize -1
    Byte.b = ReadByte(0)
    PokeB(*Buffer+offset, Byte >> 4)  ; ????
    offset+1
    PokeB(*Buffer+offset, Byte << 4)  ; ????
    offset+1
  Next
 
 
  If CreateImage(0, 255, 255, 32, #PB_Image_Transparent) And StartDrawing(ImageOutput(0))
 
    offset = 0
    For x=0 To imgW - 1
      For y=0 To imgH - 1
        Plot (x,y, PeekB(*Buffer+offset))
        offset+1
      Next
    Next
 
    StopDrawing() ;
  EndIf
  Repeat
    Event = WaitWindowEvent()
   
    If Event = #PB_Event_Repaint
      StartDrawing(WindowOutput(0))
      DrawImage(ImageID(0), 20, 10)
      StopDrawing()    
    EndIf
  Until Event = #PB_Event_CloseWindow
EndIf
 



SereZa писал(а):
лайфхак: возьми хекс редактор и в настройках там вбей..

регулярно пользуюсь этим в Hexworkshop, самый удобный визуализер у него...
https://i.imgur.com/sgadhqF.png


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: Работа с изображениями
СообщениеДобавлено: Вс авг 05, 2018 10:26 pm 
Не в сети
МОДЕРАТОР

Зарегистрирован: Вт дек 05, 2006 8:46 am
Сообщений: 6399
Благодарил (а): 21 раз.
Поблагодарили: 200 раз.
Пункты репутации: 52
На лету, сразу из файла брать байты и писать в свой файл
Код:
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
CreateImage(0, 21, 28 )
StartDrawing(ImageOutput(0))
x=1:y=1
 
If ReadFile(0, "example_20x27.bin")    
  While Eof(0) = 0  
      byt.a = ReadByte(0)
      bb$ = Hex(byt,#PB_Byte)
      If Len(bb$)=1:bb$ = "0" + bb$:EndIf
     
      hb1$=Left(Hex(byt),1)
      hb2$=Right(Hex(byt),1)
       
     Plot(x, y, RGB(Val("$" + hb1$+ hb1$), Val("$" + hb1$+ hb1$), Val("$" + hb1$+ hb1$)))
     If x<=19: x+1: Else:x=1:y+1:EndIf
     Plot(x, y, RGB(Val("$" + hb2$+ hb2$), Val("$" + hb2$+ hb2$), Val("$" + hb2$+ hb2$)))
     If x<=19: x+1: Else:x=1:y+1:EndIf
     
    Wend
    CloseFile(0)
    StopDrawing()
  SaveImage(0,"example_1.bmp",#PB_ImagePlugin_BMP)  
 
  Else
    MessageRequester("Information","Couldn't open the file!")
  EndIf


_________________
read-only ¯\_(ツ)_/¯


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: Работа с изображениями
СообщениеДобавлено: Вс авг 05, 2018 11:19 pm 
Не в сети
МОДЕРАТОР
Аватар пользователя

Зарегистрирован: Пн апр 09, 2007 4:53 pm
Сообщений: 11325
Благодарил (а): 4 раз.
Поблагодарили: 441 раз.
Зачем такие сложности со строками?
Код:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
CreateImage(0, 21, 28 )
StartDrawing(ImageOutput(0))
x=1:y=1
 
If ReadFile(0, "example_20x27.bin")    
  While Eof(0) = 0  
   
    byte.a = ReadByte(0)
   
    l.a=byte&%1111
    h.a=byte>>4&%1111
   
    Plot(x, y, RGB(h<<4|h, h<<4|h, h<<4|h))
    If x<=19: x+1: Else:x=1:y+1:EndIf
    Plot(x, y, RGB(l<<4|l, l<<4|l, l<<4|l))
    If x<=19: x+1: Else:x=1:y+1:EndIf
   
  Wend
  CloseFile(0)
  StopDrawing()
  SaveImage(0,"example_1.bmp",#PB_ImagePlugin_BMP)  
Else
  MessageRequester("Information","Couldn't open the file!")
EndIf


_________________
Компьютер позволяет решать все те проблемы, которые до его изобретения не существовали. :) :)


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: Работа с изображениями
СообщениеДобавлено: Вс авг 05, 2018 11:59 pm 
Не в сети
док
Аватар пользователя

Зарегистрирован: Сб мар 28, 2015 11:06 pm
Сообщений: 159
Откуда: Україна
Благодарил (а): 11 раз.
Поблагодарили: 11 раз.
Пункты репутации: 4
Спасиб всем, в обоих случаях картинка получилась на пиксель больше по ширине и высоте и сместилась вниз, а в варианте kvitaliy изображение начинает "портится"..
https://i.imgur.com/FFyOnVr.png

l.a=byte&%1111 и h.a=byte>>4&%1111 - это получаем старшие и младшие биты, а вот это h<<4|h чюток не понял, откуда оно?

зы: а как обратно обратить операцию?


Последний раз редактировалось LinXP Пн авг 06, 2018 1:10 am, всего редактировалось 2 раз(а).

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

Зарегистрирован: Пт фев 20, 2009 12:57 pm
Сообщений: 1713
Откуда: Алматы
Благодарил (а): 16 раз.
Поблагодарили: 46 раз.
Пункты репутации: 5
это потому что x=1:y=1

надо то x=0:y=0 - картинка то в 0 0 начинается.

обратно через point пиши. то есть через поинт получил цвет в RGB, после по своей палитре прогнал какому из цветов соответствует этот цвет. он тебе даст номер от 0 до 15 - вот его в файл и пиши.

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


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

Зарегистрирован: Сб мар 28, 2015 11:06 pm
Сообщений: 159
Откуда: Україна
Благодарил (а): 11 раз.
Поблагодарили: 11 раз.
Пункты репутации: 4
SereZa писал(а):
надо то x=0:y=0 - картинка то в 0 0 начинается.

Полагаю kvitaliy и Пётр это прекрасно знают, ведь увеличено на пиксель (по ширине и высоте) создаваемое изображение (CreateImage), а если вбить правильные - то будет ошибка в алгоритме... ))


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

Зарегистрирован: Пт фев 20, 2009 12:57 pm
Сообщений: 1713
Откуда: Алматы
Благодарил (а): 16 раз.
Поблагодарили: 46 раз.
Пункты репутации: 5
не понимаю я про какой алгоритм ты говоришь :) это ж простенько... строчка за строчкой на всю ширину. ты попробуй как у меня :) 8х8 пикселов, а потом еще кубики идут сверху вниз :) вот там мозг сломаешь пока родишь математику... а тут... тут я правда не понял как эти цвета получаются :) магия какая-то... в моем случае палитра обычно прилагается к изображению во втором файле.

Код:
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
 
;{ битовые операции
Macro SetBit(Var, Bit) ; Установка бита.
  Var | (Bit)
EndMacro
Macro ClearBit(Var, Bit) ; Обнуление бита.
  Var & (~(Bit))
EndMacro
Macro TestBit(Var, Bit)
  Bool(Var & (Bit))
EndMacro
Macro NumToBit(Num) ; Позиция бита по его номеру. ; для вызова сет бит и клер бит.
  (1<<(Num))
EndMacro
Macro GetBits(Var, StartPos, EndPos)
  ((Var>>(StartPos))&(NumToBit((EndPos)-(StartPos)+1)-1))
EndMacro
;}
 
 
 
If OpenWindow(0, 0, 0, 50, 50, "", #PB_Window_ScreenCentered|#PB_Window_SystemMenu)
 
  CanvasGadget(1, 5, 5, 40, 40)
 
  If ReadFile(2, "D:\example_20x27.bin")
    If StartDrawing(CanvasOutput(1))
     
      x = 0 : y = 0
     
      While Eof(2) = 0
       
        byte.a = ReadByte(2)
       
        first.a  = GetBits(byte, 4, 7)
        second.a = GetBits(byte, 0, 3)
       
        Plot(x, y, RGB(first<<4|first, first<<4|first, first<<4|first))
       
        x + 1
       
        Plot(x, y, RGB(second<<4|second, second<<4|second, second<<4|second))
       
        x + 1
       
        If x = 20
          y + 1
          x = 0
        EndIf        
       
      Wend
     
     
      StopDrawing()
    EndIf
   
    CloseFile(2)
  EndIf
 
  Repeat
    Event = WaitWindowEvent()
 
    If Event = #PB_Event_CloseWindow  ; If the user has pressed on the close button
      Quit = 1
    EndIf
 
  Until Quit = 1
 
 
EndIf
 
 



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

Зарегистрирован: Сб мар 28, 2015 11:06 pm
Сообщений: 159
Откуда: Україна
Благодарил (а): 11 раз.
Поблагодарили: 11 раз.
Пункты репутации: 4
SereZa, да поэтому я и не лезу в старые игры: биты, палитра, спрайты, RLE... вынос мозга... а тут попалась вроде 2018го, но разрабы - японцы..
Вот это просьба объяснить first<<4|first , понимаю для чего, но не понимаю как оно работает? обратно вернуть значение можно просто разделив его на 16?

как биты сложить?
Код:
1
2
3
4
5
6
7
8
9
10
byte.a = 69
first.a=(byte&%1111)<<4|(byte&%1111)
second.a=(byte>>4&%1111)<<4|(byte>>4&%1111)
 
Debug first                      ; 85
Debug second                     ; 68
 
; обратно как?
bytenew.a = (first/16 << 4) | second/16   ; ??????
Debug bytenew                      ; 69



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

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

Код:
1
2
3
4
For i = 0 To 15
  value = i<<4|i  
  Debug "номер цвета " + Str(i) + ", RGB(" + Str(value) + ", " + Str(value) + ", " + Str(value) + ")"
Next



получается тебе надо взять изображение, которое ты нарисовал - при условии конечно если ты правильные цвета в изображении применял когда рисовал - и начинать прогонять через Point - возвращая цвет из каждой точки. после этого этот цвет прогонять через массив (или этот цикл) на предмет совпадений. типа в точке 0:0 цвет был черный, значит в цикле найдется этот цвет под номером 0. потом там какойнить серобуромалиновый - он там типа 3. и потом, когда ты получил два цвета 0 и 3 - из них рожаем первый байт нашего нового файла:
Код:
1
cvet1 << 4 + cvet2


поскольку цвет 1 у нас 0, то при сдвиге на 4 бита влево ничего не изменится. он ж ноль :) получается первый байт это $03. и так прогоняешь по всему изображению, пихая по 2 пикселя в один байт.


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

Зарегистрирован: Сб мар 28, 2015 11:06 pm
Сообщений: 159
Откуда: Україна
Благодарил (а): 11 раз.
Поблагодарили: 11 раз.
Пункты репутации: 4
SereZa не, речь сейчас не про цвета, с этим я разобрался.
У меня был байт, допустим 69, разложил их на старший и младший l.a=byte&%1111 , h.a=byte>>4&%1111 (получил 5 и 4) как мне их обратно сложить чтоб получилось опять 69? если l << 4 + h то получается 84


Последний раз редактировалось LinXP Пн авг 06, 2018 2:35 am, всего редактировалось 1 раз.

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

Зарегистрирован: Пт фев 20, 2009 12:57 pm
Сообщений: 1713
Откуда: Алматы
Благодарил (а): 16 раз.
Поблагодарили: 46 раз.
Пункты репутации: 5
SereZa писал(а):
Код:
1
cvet1 << 4 + cvet2



местами поменяй. у тебя не прально порядок. ты получается второй пиксель пишешь, потом первый :)


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

Зарегистрирован: Сб мар 28, 2015 11:06 pm
Сообщений: 159
Откуда: Україна
Благодарил (а): 11 раз.
Поблагодарили: 11 раз.
Пункты репутации: 4
ааа блин, биты местами перепутал, вот и не получалось, делал l << 4 + h а надо было h << 4 + l

а здесь viewtopic.php?f=1&t=1590&p=89858#p89854 скобок не хватало, надо bytenew.a = ((second/16) << 4) + first/16
Спасиб, буду пока вникать дальше


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: Работа с изображениями
СообщениеДобавлено: Пн авг 06, 2018 7:22 am 
Не в сети
МОДЕРАТОР

Зарегистрирован: Вт дек 05, 2006 8:46 am
Сообщений: 6399
Благодарил (а): 21 раз.
Поблагодарили: 200 раз.
Пункты репутации: 52
LinXP писал(а):
Спасиб всем, в обоих случаях картинка получилась на пиксель больше по ширине и высоте и сместилась вниз, а в варианте kvitaliy изображение начинает "портится"..

Я же, как обычно, просто принцип показал на понятном примере, как сделать из одного байта 2 пикселя с 16-ю градациями яркости. А если надо правильный рисунок и непонятный код, то вот так будет:
Код:
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
Macro D_LOBYTE(byte)
       ( byte & $F )<<4|( byte & $F )  
 EndMacro
 Macro D_HIBYTE(byte)    
   (( byte >> 4 ) & $F)<<4|(( byte >> 4 ) & $F)  
 EndMacro
 Wd=20
 Hg=27
 If ReadFile(0, "example_20x27.bin")
    CreateImage(0, Wd, Hg )
    StartDrawing(ImageOutput(0))
    For y=0 To Hg-1
      For x=0 To Wd-1
        byte.a = ReadByte(0)
        l.a=D_LOBYTE(byte)
        h.a=D_HIBYTE(byte)
           Plot(x, y, RGB(h,h,h))
           x=x+1
           Plot(x, y, RGB(l,l,l))
         Next
       Next
  CloseFile(0)
  StopDrawing()
  SaveImage(0,"example_1.bmp",#PB_ImagePlugin_BMP)  
Else
  MessageRequester("Information","Couldn't open the file!")
EndIf


_________________
read-only ¯\_(ツ)_/¯


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

Зарегистрирован: Пт фев 20, 2009 12:57 pm
Сообщений: 1713
Откуда: Алматы
Благодарил (а): 16 раз.
Поблагодарили: 46 раз.
Пункты репутации: 5
LinXP писал(а):
+ first/16

каких еще скобок? и что за деление на 16? это чистые байты 5 и 4 - номера цветов. зачем ты 4 собрался делить на 16? у тебя тогда не получится твое 69 число.

а тьфу... это ж не мой код :) тогда да. но придумал ты какую-то фигню... создай массив цветов и по их номерам составляй файл. а то сначала смещение туда, потом смещение обратно... нафига козе боян?


Вернуться наверх
 Профиль  
 
Показать сообщения за:  Сортировать по:  
Начать новую тему Ответить на тему  [ Сообщений: 155 ]  На страницу Пред.  1 ... 7, 8, 9, 10, 11  След.

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


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

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


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

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