PureBasic - форум

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

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


Вы здесь » PureBasic - форум » PureBasic для Windows » Генерация палитры


Генерация палитры

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

1

Создание файла палитры.

Код:
File  = CreateFile(#PB_Any, "Palette.pal")
For r = 0 To  255
  For g = 0 To  255
    For b = 0 To  255
      WriteAsciiCharacter(File, r)
      WriteAsciiCharacter(File, g)
      WriteAsciiCharacter(File, b)
    Next
  Next
Next

Конвертация в BMP.

Код:
#PIXEL  = 256 * 256 * 256
Line  = Pow(#PIXEL, 1/2)

Palette = ReadFile(#PB_Any, "Palette.pal")

Macro Get()
  ReadAsciiCharacter(Palette)
EndMacro

Image =  CreateImage(#PB_Any, Line, Line, 24)
StartDrawing(ImageOutput(Image))
  For x = 0 To  Line-1
    For y = 0 To  Line-1
      Plot(x, y,  RGB(Get(),  Get(),  Get()))
    Next
  Next
StopDrawing()
SaveImage(Image,  "Palette.bmp")  

Что-то картинка не соответствует ожидаемому.

0

2

Что ожидается?

0

3

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

Что-то картинка не соответствует ожидаемому.

Если ожидаемое, должно быть таким:
http://forumupload.ru/uploads/0009/ae/28/644/t786348.jpg
И у вас в коде всё в порядке. То наверно, это "баг компилятора" ...

0

4

через 16 пикселов по горизонтали происходит новый цикл по одной из переменных

0

5

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

через 16 пикселов по горизонтали происходит новый цикл по одной из переменных

Нет исходя из содержимого файла Palette.pal.
У вас построение изображения не соответствует данным палитры.

0

6

по 3 байта пишу и по 3 читаю.

0

7

То что пишите и читаете по 3 байта вовсе не означает что точки размещаются в нужных местах.

0

8

последовательно же мне и нужно просто было сохранить всю палитру цветов. подсчитал цвета - все на месте

0

9

Вы пишете в свой файл палитры, диапазоны трёх цветов RGB, по сути трёхмерность. При этом, читаете этот третичный диапазон как двухмерность. У вас не синхронизировано чтение в формуле. Сделайте в вашем втором коде(где создаётся bmp):

Код:
Line  = Pow(#PIXEL, 1/3)

И увидете, что ваша палитра станет правильной.  Полный пример чтения вашего  файла палитры, в CanvasGadget:

Код:
#PIXEL  = 255 * 255 * 255
Line  = Pow(#PIXEL, 1/3)

Palette = ReadFile(#PB_Any, "Palette.pal")

Macro Get()
  ReadAsciiCharacter(Palette)
EndMacro

If OpenWindow(0, 0, 0, Line+20, Line+20, "", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
  CanvasGadget(0, 10, 10, Line, Line)
  
  StartDrawing(CanvasOutput(0))
  For x = 0 To  Line-1
    For y = 0 To  Line-1
      Plot(x, y,  RGB(Get(),  Get(),  Get()))
    Next
  Next
  StopDrawing()
  
  Repeat
    Event = WaitWindowEvent()
  Until Event = #PB_Event_CloseWindow
EndIf

Но, зачем такие сложности, зачем создавать файл в 50Мб, при этом делать 50млн. записей и соответствующую кучу чтений? Это микровыстрел в жёсткий диск для всех, кто будет это делать. Можно более удобно записать и прочитать. Ну и к тому же в PB, есть встроенные способы работы с градиентами, которые можно подогнать под необходимую вам палитру.

P.S. на будущее, к вам просьба. Если задаёте вопрос, то, задавайте его как можно развёрнутее (если вы конечно не "тролль"). Не стесняйтесь писать больше и в том числе прилагать скриншоты(при необходимости, либо для правильного визуального восприятия, либо если что-то сложно описать).
Чем лучше, вы опишете свой вопрос, тем более вероятнее вам лучше и ответят. Никто не обязан догадываться, что вы там имеете ввиду, в своих двух фразах.

Отредактировано Webarion (06.10.2023 02:12:35)

0

10

Webarion

Это микровыстрел в жёсткий диск

Файл имеет буфер/кеш, даже если пишет по байтам он пишет сначала в память и при заполнении буфера скидывает на жёсткий данные. То есть не пишет каждый байт отдельно. И этот размер буфера ещё можно задать самостоятельно, по умолчанию 4096 байт в PureBasic. Задаётся функцией FileBuffersSize(). Что интересно что это размер кластера по умолчанию.

Отредактировано AZJIO (04.10.2023 21:37:22)

0

11

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

Webarion

    Это микровыстрел в жёсткий диск

Файл имеет буфер/кеш, даже если пишет по байтам он пишет сначала в память и при заполнении буфера скидывает на жёсткий данные. То есть не пишет каждый байт отдельно. И этот размер буфера ещё можно задать самостоятельно, по умолчанию 4096 байт в PureBasic. Задаётся функцией FileBuffersSize(). Что интересно что это размер кластера по умолчанию.

Отредактировано AZJIO (Сегодня 21:37:22)

Ок, принимается. Не работал с файлами так подробно, поэтому описал в этом отношении только своё вИдение. И всё же я пока ещё насторожен в последовательности CreateFile() - Write...
В чём разница в принципах:
1. - CreateFile()-Write-Write.....Конец программы
2. - OpenFile()-Write-Write...CloseFile()

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

P.S. Кстати AZJIO, у тебя в документации на CreateFile, ничего не написано о закрытии файла. Но, в примере кода присутствует CloseFile(0). Нужно бы это как-то обрулить в самой документации. Т.е. понимание в какой момент, действительно идёт запись на диск, допустим, если данные не превышают буфер. Так и хранятся в памяти, ожидая закрытия программы?

Отредактировано Webarion (09.10.2023 21:54:26)

0

12

Когда записать на диск решает система, но можно принудительно произвести запись вызвав функцию FlushFileBuffers().
У функции CreateFile() есть флаг #PB_File_NoBuffering позволяющий отключить буферизацию.

0

13

Пётр написал(а):

Когда записать на диск решает система, но можно принудительно произвести запись вызвав функцию FlushFileBuffers().
У функции CreateFile() есть флаг #PB_File_NoBuffering позволяющий отключить буферизацию.

Спс. Лан, я потестю это всё просто ради интереса.

Отредактировано Webarion (09.10.2023 21:47:29)

0

14

Webarion
Автор перевода справки не я.

0

15

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

Webarion
Автор перевода справки не я.

И что теперь, не отклоняться ни от одного слова?
Да, ты не автор основного перевода. Но ты сделал большой труд.
И ты имеешь право вносить изменения, на своём языке.
Для этого и существует логика Git имеющая разные версии и мнения.

Отредактировано Webarion (05.10.2023 10:13:41)

0

16

Webarion
Я ни одной страницы не изменял. Отписываю в теме "Улучшение справки" все недостатки, которые нахожу. Если я начну делать ответвление, то будет двойная работа,  один будет вносить обновления в свой проект справки другой не имея этого обновления будет вносить исправления и у нас будет две недосправки.

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

Отредактировано AZJIO (05.10.2023 07:04:23)

0

17

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

Если я начну делать ответвление, то будет двойная работа,  один будет вносить обновления в свой проект справки другой не имея этого обновления будет вносить исправления и у нас будет две недосправки.

Именно для этого и существуют такие сервисы как Github.

0


Вы здесь » PureBasic - форум » PureBasic для Windows » Генерация палитры