PureBasic - форум

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

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


Вы здесь » PureBasic - форум » Вопросы по PureBasic » Программа для вставки в turbo pascal jpg картинок


Программа для вставки в turbo pascal jpg картинок

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

1

Хочу чтоб в turbo pascal можно было загрузить jpg картинку. Т. к. TP под DOS, то напрямую не как. Когда то, я писал на нем (на TP) граф. редактор. И там я использовал такой принцип: сохранял свою картинку в txt файле, где были записаны координаты всех точек (640*480) картинки и их цвет. Потом я писал цикл в TP где эти точки все выводил. Ну а теперь пришла в голову такая мысль: написать на PB программку которая берет изображение и записывает в файл цвета всех точек.  Вопросов появилось два:
   1) Как узнать в PB цвет точки на определенном изображении?
   2) Т. К. в TP в режиме "detect" всего 15 цветов, как найти для цвета точки с изображения самый подходящий из этих 15-ти?
Если подскажите другой более простой принцип загрузки в TP изображений буду очень благодарен! Заранее спасибо.

0

2

1 вопрос в справке нашел, остался второй

0

3

Можно сделать так:

Код:
UseJPEGImageDecoder() ; Поддержка загрузки JPG
UsePNGImageDecoder()  ; и PNG рисунков.

If LoadImage(0,"Image.jpg")=0
  MessageRequester("", "Нет рисунка!", 48)
  End
EndIf

If CreateFile(0, "ResultImage.bin")=0
  MessageRequester("", "Не удалось создать файл!", 48)
  End
EndIf

Width = ImageWidth(0)
Height = ImageHeight(0)
WriteWord(0, Width)
WriteWord(0, Height)

Width-1 : Height-1

If StartDrawing(ImageOutput(0)) ; Разложение рисунка на точки и запись в файл.
  For x=0 To Width
    For y=0 To Height
      Color = Point(x, y)
      Byte.c = (Red(Color)/32) | (Green(Color)/32) | (Blue(Color)/32)
      WriteByte(0, Byte)
    Next y
  Next x
  StopDrawing()
EndIf
CloseFile(0)
MessageRequester("", "Завершено", 64)

В файле будет в 1 и 2 байте - ширина рисунка, в 3 и 4 - высота, а остальные данные, цвет точек рисунка.

0

4

Код:
Byte.c = (Red(Color)/32) | (Green(Color)/32) | (Blue(Color)/32)

Пётр, а зачем на 32 делить? Не пнял если честно.

0

5

Спасибо за ответ, я не понял смысл программы, программа записывает в файл байты, которые отображаются квадратами в блокноте. Вопрос в том, как это читать и зачем это нужно?

0

6

Иван написал(а):

отображаются квадратами в блокноте

А причем здесь вообще блокнот?
Ведь эти данные будет обрабатывать программа и они сейчас представлены в довольно удобном виде для разворота картинки на экране.

Иван написал(а):

Вопрос в том, как это читать и зачем это нужно?

Читать в проге на паскале и с помощью двух вложенных циклов разворачивать картинку на экране.

0

7

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

Читать в проге на паскале и с помощью двух вложенных циклов разворачивать картинку на экране.

Я понимаю что это форум pb а не tp, но мне кажется вы и в tp разбираетесь, поэтому спрошу, а что именно считать? В них же цвет не записан.

0

8

По моему из кода должно быть понятно как воссоздать картинку.
Алгоритм примерно такой:

Код:
ReadFile(0, "image.bin")
Width = ReadWord(0)-1
Height = ReadWord(0)-1

For x=0 To Width
  For y=0 To Height
    Plot(x, y,ReadAsciiCharacter(0))
  Next y
Next x
CloseFile(0)

0

9

Пётр, это код PB, но я же пишу это для TP. Я не понимаю как считать это дело из TP. Он же всего 15 цветов поддерживает( Но у меня тут появилась такая идея:записывать в файл цвета точки Rgb, rGb и rgB, а в TP смотреть что из этого больше, и в зависимости от этого определять цвет точки.

0

10

Иван написал(а):

Пётр, это код PB, но я же пишу это для TP

Это алгоритм построения картинки.
Перепиши его на TP и будет то, что нужно.

Иван написал(а):

Но у меня тут появилась такая идея:записывать в файл цвета точки

В файле и так уже цвета точек.

0

11

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

В файле и так уже цвета точек.

Желательно чтоб они были цифрой, а не квадратом, потому что я в TP тот еще программист и мои знания ограничиваются самоучителем для начинающих. Кстати я уже начал делать свой вариант. Спасибо за ответы. 3-ий мне помог.

0

12

Иван написал(а):

чтоб они были цифрой, а не квадратом

Так они там не буквами и не треугольником. :D
Там значения от 0 до 15, обозначающие цвет точек. :dontknow:

0

13

Код:
UseJPEGImageDecoder() ; Поддержка загрузки JPG
UsePNGImageDecoder()  ; и PNG рисунков.
file1$=OpenFileRequester("Откиыть jpg","","",0)
file2$=SaveFileRequester("Сохранить","","",0)
If LoadImage(0,file1$)=0
  MessageRequester("", "Нет рисунка!", 48)
  End
EndIf
ResizeImage( 0, 640, 480)
If CreateFile(0, file2$)=0
  MessageRequester("", "Не удалось создать файл!", 48)
  End
EndIf


If StartDrawing(ImageOutput(0)) ; Разложение рисунка на точки и запись в файл.
  For x=0 To 639
    For y=0 To 479
      Color = Point(x, y)
      R=(Red(Color))
      G=(Green(Color))
      B=(Blue(Color))
      
      If R<168 And g<168 And b<168 
       col.s="0"
      EndIf 
      If R<168 And g<168 And b>=168 
       col.s="1"
      EndIf  
      If R<168 And g>=168 And b<168 
       col.s="2"
      EndIf  
      If R<168 And g>=168 And b>=168
       col.s="3"
      EndIf  
      If R>=168 And g<168 And b<168 
       col.s="4"
      EndIf  
      If R>=168 And g<168 And b>=168 
       col.s="5"
      EndIf  
      If R>=168 And g<168 And b<168 
       col.s="6"
      EndIf  
      If R>=168 And g>=168 And b>=168 
       col.s="7"
      EndIf  
      If R<168 And g<168 And b<168 
       col.s="8"
      EndIf  
      If R<168 And g<168 And b>=168 
       col.s="9"
      EndIf  
      If R<168 And g>=168 And b<168 
       col.s="10"
      EndIf  
      If R<168 And g>=168 And b>=168 
       col.s="11"
      EndIf  
      If R>=168 And g<168 And b<168 
       col.s="12"
      EndIf  
      If R>=168 And g<168 And b>=168 
       col.s="13"
      EndIf  
      If R>=126 And g>=168 And b<168 
       col.s="14"
      EndIf  
      If R>=126 And g>=126 And b>=168 
       col.s="15"
      EndIf
      pisat.s=Str(r)+"."+Str(g)+"."+Str(b)
      If col="" 
        MessageRequester("Цвет не найден", pisat)
      EndIf  
      WriteStringN(0,col)
      Next y
   Next x
  StopDrawing()
EndIf
CloseFile(0)
MessageRequester("", "Завершено", 64)

Не стол усложнять задачу и сделал по свойму.

0

14

Код:
OpenWindow(1,0,0,100,110,"Введите X и Y",#PB_Window_ScreenCentered|#PB_Window_SystemMenu)
StringGadget(2,10,10,80,30,"x")
StringGadget(3,10,40,80,30,"y")
ButtonGadget(4,10,70,80,30,">>")
Repeat
event=WindowEvent()
If event=#PB_Event_Gadget
  If EventGadget()=4
    xx=Val(GetGadgetText(2))
    yy=Val(GetGadgetText(3))
    CloseWindow(1)
    Break
  EndIf  
EndIf  
Until EventGadget()=400
UseJPEGImageDecoder() ; Поддержка загрузки JPG
UsePNGImageDecoder()  ; и PNG рисунков.
file1$=OpenFileRequester("Откиыть jpg","","",0)
file2$=SaveFileRequester("Сохранить","","",0)
If LoadImage(0,file1$)=0
  MessageRequester("", "Нет рисунка!", 48)
  End
EndIf
If yy=0 : yy=xx*(ImageHeight(0)/ImageWidth(0)):EndIf
ResizeImage( 0, xx, yy)
If CreateFile(0, file2$)=0
  MessageRequester("", "Не удалось создать файл!", 48)
  End
EndIf

WriteStringN(0,Str(xx))
WriteStringN(0,Str(yy))           

If StartDrawing(ImageOutput(0)) ; Разложение рисунка на точки и запись в файл.
  For x=0 To xx-1
    For y=0 To yy-1
      Color = Point(x, y)
      R=(Red(Color))
      G=(Green(Color))
      B=(Blue(Color))
      
      If R<168 And g<168 And b<168 
       col.s="0"
      EndIf 
      If R<168 And g<168 And b>=168 
       col.s="1"
      EndIf  
      If R<168 And g>=168 And b<168 
       col.s="2"
      EndIf  
      If R<168 And g>=168 And b>=168
       col.s="3"
      EndIf  
      If R>=168 And g<168 And b<168 
       col.s="4"
      EndIf  
      If R>=168 And g<168 And b>=168 
       col.s="5"
      EndIf  
      If R>=168 And g<168 And b<168 
       col.s="6"
      EndIf  
      If R>=168 And g>=168 And b>=168 
       col.s="7"
      EndIf  
      If R<168 And g<168 And b<168 
       col.s="8"
      EndIf  
      If R<168 And g<168 And b>=168 
       col.s="9"
      EndIf  
      If R<168 And g>=168 And b<168 
       col.s="10"
      EndIf  
      If R<168 And g>=168 And b>=168 
       col.s="11"
      EndIf  
      If R>=168 And g<168 And b<168 
       col.s="12"
      EndIf  
      If R>=168 And g<168 And b>=168 
       col.s="13"
      EndIf  
      If R>=126 And g>=168 And b<168
        col.s="14"
      EndIf  
      If R>=126 And g>=126 And b>=168 
       col.s="15"
      EndIf
      pisat.s=Str(r)+"."+Str(g)+"."+Str(b)
      If col="" 
        MessageRequester("Цвет не найден", pisat)
      EndIf  
      WriteStringN(0,col)
      Next y
   Next x
  StopDrawing()
EndIf
CloseFile(0)
MessageRequester("", "Завершено", 64)

Еще один вопрос, вот код и вылетает ошибка на строку StartDrawing что #image не инициализирован. Подскажите пожалуйста, в чем дело?

0

15

Иван написал(а):

Еще один вопрос, вот код и вылетает ошибка на строку StartDrawing что #image не инициализирован.

Эта ошибка появляется  если не задать x и y в окне.

0

16

Да, но при не заполнение Y-ка ошибка вылетать не должна т. к. есть штука:

Код:
If yy=0 : yy=xx*(ImageHeight(0)/ImageWidth(0)):EndIf

Но все равно вылетает.

0

17

Иван написал(а):

Да, но при не заполнение Y-ка ошибка вылетать не должна т. к. есть штука:

Если заполнить только X, то программа не вылетает и работает нормально без ошибок.

0

18

Странно, а какая у вас версия PB?

0

19

4.51.

0


Вы здесь » PureBasic - форум » Вопросы по PureBasic » Программа для вставки в turbo pascal jpg картинок