purebasic.info

PureBasic forum
Текущее время: Вс ноя 19, 2017 9:46 am

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




Начать новую тему Ответить на тему  [ Сообщений: 78 ]  На страницу Пред.  1, 2, 3, 4, 5, 6  След.
Автор Сообщение
СообщениеДобавлено: Чт май 18, 2017 9:38 am 
Не в сети
профессор
Аватар пользователя

Зарегистрирован: Пт янв 27, 2012 7:12 pm
Сообщений: 880
Откуда: Кустанай
Благодарил (а): 27 раз.
Поблагодарили: 13 раз.
Пункты репутации: 7
Ещё про рисовалки

Суть в следующем, надо на график нанести линию наискосок, как слеш(/)
1) Нажать лкм, это будет x1,y1
2) Начать двигать мышку, и линия должна уже начать рисоваться, при этом лкм не отпущена. Сложность в том, что мышка не будет двигаться по прямой траектории, а линия должна быть прямой. Координаты x2,y2 это положение указателя мыши.
3) Отпустить лкм, это и будут конечные координаты.
Таким образом должна нарисоваться lineXY с координатами
#PB_EventType_LeftButtonDown = х1 у1
#PB_EventType_LeftButtonUp = х2 у2
но в процессе перемещения мыши результат должен уже быть виден.

Пример, на рабочем столе, нажатая лкм рисует квадрат, он виден сразу но меняется от положения мыши.


Вернуться наверх
 Профиль  
 
СообщениеДобавлено: Чт май 18, 2017 10:00 am 
Не в сети
МОДЕРАТОР
Аватар пользователя

Зарегистрирован: Пн апр 09, 2007 4:53 pm
Сообщений: 11053
Благодарил (а): 4 раз.
Поблагодарили: 374 раз.
В папке с примерами дистрибутива есть файл CanvasGadget.pb. В режиме рисования Line он рисует линию соответствующую описанию.

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


Вернуться наверх
 Профиль  
 
СообщениеДобавлено: Чт май 18, 2017 10:21 am 
Не в сети
профессор
Аватар пользователя

Зарегистрирован: Пт янв 27, 2012 7:12 pm
Сообщений: 880
Откуда: Кустанай
Благодарил (а): 27 раз.
Поблагодарили: 13 раз.
Пункты репутации: 7
Пётр писал(а):
В папке с примерами дистрибутива есть файл CanvasGadget.pb. В режиме рисования Line он рисует линию соответствующую описанию.

Петр спасибо, нашел, все отлично :D


Вернуться наверх
 Профиль  
 
СообщениеДобавлено: Пн май 29, 2017 12:04 pm 
Не в сети
профессор

Зарегистрирован: Пн июл 22, 2013 11:00 pm
Сообщений: 531
Благодарил (а): 2 раз.
Поблагодарили: 29 раз.
Пункты репутации: 9
Рисуй различные линии с помощь встроенной библиотеки GDI :roll:
Код:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
 
dc=StartDrawing(CanvasOutput(0))
 
  Protected Dim massiv_tohek.POINT(30)
  hPen=CreatePen_(#PS_SOLID,6,RGB(437, 817, 510));выбор кисти,её ширины,и цвета
hOldPen=SelectObject_(dc, hPen);устанавливаем выбранную кисть для рисования
 
  massiv_tohek(0)\x=213
  massiv_tohek(0)\y=243
  massiv_tohek(1)\x=117
  massiv_tohek(1)\y=123
  massiv_tohek(2)\x=168
  massiv_tohek(2)\y=282
  massiv_tohek(3)\x=225
  massiv_tohek(3)\y=134
  massiv_tohek(4)\x=298
  massiv_tohek(4)\y=23
Polyline_(dc,@massiv_tohek(0),4)
    SelectObject_(dc, hOldPen)
    DeleteObject_(hPen)
StopDrawing()
 



Вернуться наверх
 Профиль  
 
СообщениеДобавлено: Пт авг 04, 2017 7:27 am 
Не в сети
профессор

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

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

есть инструмент кисточка - отслеживает координаты мышки и рисует под курсором точку. с этим тоже вроде бы проблем нет.

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

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

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

а второй затык - ежели с рисованием кисточкой проблем не возникнет - пишем в координаты массива, по тем-же координатам что plot - новый цвет, то как быть с заливкой цвета FillArea? её записать в массив не получится. чтобы инфу о новом цвете записать в координаты массива - это нужно будет прогонять через point, что опять таки при таком-же цвете в палитре - испортит картинку. как выкрутится?


Вернуться наверх
 Профиль  
 
СообщениеДобавлено: Вс авг 06, 2017 6:28 pm 
Не в сети
профессор

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


Вернуться наверх
 Профиль  
 
СообщениеДобавлено: Пн авг 07, 2017 2:12 am 
Не в сети
профессор
Аватар пользователя

Зарегистрирован: Чт июн 25, 2009 1:02 pm
Сообщений: 2227
Откуда: Russia — Belarus
Благодарил (а): 0 раз.
Поблагодарили: 65 раз.
Пункты репутации: 11
Звучит как индексирование цветов, или пастеризация. Т.е. надо искать их алгоритмы.

_________________
EnableExplicit User


Вернуться наверх
 Профиль  
 
СообщениеДобавлено: Пт сен 08, 2017 2:25 pm 
Не в сети
профессор

Зарегистрирован: Пт фев 20, 2009 12:57 pm
Сообщений: 1547
Откуда: Алматы
Благодарил (а): 11 раз.
Поблагодарили: 36 раз.
Пункты репутации: 5
есть буржуйский код для зеркалирования графики RotateImage.pb:
Код:
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
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
;******************************************************************************
;*
;* Image Rotation routines for 24/32 bit with optional AA
;* by Luis, http://luis.no-ip.net
;* v1.10 for PB 5.30
;*
;* Tested under Windows 32/64 bit and Linux 32 bit with PB 4.40 B2
;*
;* These routines can deal with both 24/32 bit images and with the alpha channel.
;* The output of the routines will be an image with the same number of BPP
;* as the one passed in input to them. The source image is not freed.
;*
;* Inspired by a simpler Visual Basic code from Robert Rayment. Thank you.
;* http://www.planet-source-code.com/vb/scripts/ShowCode.asp?txtCodeId=23476&lngWId=1
;*
;* ----------------------------------------------------------------------------
;*
;* RotateImageFree (nSrcImage, fDegRot.f, flgAntiAliasing, FillColor)
;*
;*  nSrcImage           The 24/32 bit PureBasic's image to rotate
;*  fDegRot             Float angle in degrees (+/-) 0.0 -> 360.0
;*  flgAntiAliasing     0 for simpler rotation, 1 for antialiased rotation
;*  FillColor           Used to fill the new areas of the resulting image
;*
;*  Return              a 24/32 bit image rotated by fDegRot
;*
;* NOTES :
;*  FillColor is not used with 32 bit images, the new areas are always transparent.
;*
;*  FillColor can be set to a unique color with 24 bit images if you want to
;*  draw the resulting image with masking using GDI functions under Windows,
;*  for example. Or maybe to simply match a certain background color.
;*
;*  The anti aliasing use 4 pixels to do the AA, this is useful especially
;*  when text is present on the image to be rotated to obtain a good quality
;*  at the expense of speed. A free-angle rotation really need AA !
;*
;* ----------------------------------------------------------------------------
;*
;* RotateImage (nSrcImage, DegRot)
;*
;*  nSrcImage           The 24/32 bit PureBasic's image to rotate
;*  DegRot              Integer angle in degrees (+/-) 90/180/270
;*
;*  Return              a 24/32 bit image rotated by DegRot
;*
;* NOTES :
;*   Use this procedure to rotate by multiples of 90 degrees instead of RotateImageFree().
;*   It's faster and it's not subject to rounding errors.
;*
;* ----------------------------------------------------------------------------
;*
;* FlipImage (nSrcImage)
;*
;*  nSrcImage           The 24/32 bit PureBasic's image to flip
;*
;*  Return              a 24/32 bit image flipped vertically
;*
;* ----------------------------------------------------------------------------
;*
;* MirrorImage (nSrcImage)
;*
;*  nSrcImage           The 24/32 bit PureBasic's image to mirror
;*
;*  Return              a 24/32 bit image mirrored horizontally
;*
;******************************************************************************
 
 
#EXC_ALLOC_ERR = 1
 
CompilerIf Defined(Macro_TRY, #PB_Constant) = 0
#Macro_TRY = 1
 
Global EXCEPTION
 
Macro TRY (exp, exc = 0)
; [DESC]
; Evaluate the expression and jump to the corresponding CATCH if it's false.
;
; [INPUT]
; exp : The expression to test.
; exc : An optional numeric code to identify the exception type for the CATCH.
;
; [NOTES]
; This is inspired to real exception handling but it isn't.
; The purpose of this TRY/CATCH pair is to avoid messy, deep error checking in structured code
; and to wrap the use of GOTO inside something more convenient to read/follow.
; You can write the main body of the code under the assumption nothing is going wrong,
; and concentrate the cleanup / recovery in a single place, keeping single entry and exit points.
;
; Example:
;
; Procedure.i MyProc()
;
;  TRY (ProcA(), 1)
;  ...
;  TRY (ProcB(), 2)
;  ...
;  TRY (ProcC(), 3)
;  ...
;
;  ProcedureReturn 1 ; success
;  
;  CATCH
;  
;  Select EXCEPTION
;   Case 1 : ; specific cleanup
;   Case 2 : ; specific cleanup
;   Case 3 : ; specific cleanup
;   Default : ; fallback
;  EndSelect
;
;  ProcedureReturn 0 ; failure
; EndProcedure
;
 
 If Not (exp)
    EXCEPTION = exc
    Goto label_catch_exception
 Else
    EXCEPTION = 0
 EndIf
EndMacro
 
Macro RAISE (exc = 0)
; [DESC]
; Unconditionally jump to the corresponding CATCH.
;
; [INPUT]
; exc : An optional numeric code to identify the exception type for the CATCH.
 
 EXCEPTION = exc
 Goto label_catch_exception
 EndMacro
 
Macro CATCH()
; [DESC]
; Receive the control from the program when the TRY expression is false.
;
; [NOTES]
; See the command TRY
 
 label_catch_exception:
EndMacro
 
CompilerEndIf
 
Structure T_RGBA
 B.a
 G.a
 R.a
 A.a
EndStructure
 
Macro RGB_B(color)
 ((color & $FF0000) >> 16)
EndMacro
 
Macro RGB_G(color)
 ((color & $FF00) >> 8)
EndMacro
 
Macro RGB_R(color)
 (color & $FF)
EndMacro
 
Macro RGB_Mix (r, g, b)
 ((((b) << 8 + (g)) << 8) + (r))
EndMacro
 
Macro CopyPixel32 (Xs, Ys, Xd, Yd, BufferPitchSrc, BufferPitchDest, ptRGBAs, ptRGBAd, pMemSrc, pMemDest)
 ptRGBAs = pMemSrc  + (Ys) * BufferPitchSrc + (Xs) << 2
 ptRGBAd = pMemDest + (Yd) * BufferPitchDest + (Xd) << 2        
 ptRGBAd\R = ptRGBAs\R
 ptRGBAd\G = ptRGBAs\G
 ptRGBAd\B = ptRGBAs\B        
 ptRGBAd\A = ptRGBAs\A
EndMacro
 
Macro CopyPixel24 (Xs, Ys, Xd, Yd, BufferPitchSrc, BufferPitchDest, ptRGBAs, ptRGBAd, pMemSrc, pMemDest)
 ptRGBAs = pMemSrc  + (Ys) * BufferPitchSrc + (Xs) * 3
 ptRGBAd = pMemDest + (Yd) * BufferPitchDest + (Xd) * 3
 ptRGBAd\R = ptRGBAs\R
 ptRGBAd\G = ptRGBAs\G
 ptRGBAd\B = ptRGBAs\B        
EndMacro
 
Macro ReadPixel32 (X, Y, BufferPitchSrc, ptRGBA, pMemSrc)
 ptRGBA = pMemSrc + (Y) * BufferPitchSrc + (X) << 2
EndMacro
 
Macro ReadPixel24 (X, Y, BufferPitchSrc, ptRGBA, pMemSrc)
 ptRGBA = pMemSrc + (Y) * BufferPitchSrc + (X) * 3
EndMacro
 
Macro WritePixel32 (tPixel, X, Y, BufferPitchDest, ptRGBA, pMemDest)
 ptRGBA = pMemDest + (Y) * BufferPitchDest + (X) << 2                      
 ptRGBA\R = tPixel\R
 ptRGBA\G = tPixel\G
 ptRGBA\B = tPixel\B
 ptRGBA\A = tPixel\A
EndMacro
 
Macro WritePixel24 (tPixel, X, Y, BufferPitchDest, ptRGBA, pMemDest)
 ptRGBA = pMemDest + (Y) * BufferPitchDest + (X) * 3
 ptRGBA\R = tPixel\R
 ptRGBA\G = tPixel\G
 ptRGBA\B = tPixel\B
EndMacro
 
Procedure.i AllocateImageData (nImage, *BufferPitch.Integer, FillColor = -1)
 Protected *ImageMem, *AllocMem, BufferPitch
 
 StartDrawing(ImageOutput(nImage))
   
  *ImageMem = DrawingBuffer()
  BufferPitch = DrawingBufferPitch()
 
   If FillColor <> -1
    Select ImageDepth(nImage)
        Case 24
            Box(0, 0, ImageWidth(nImage), ImageHeight(nImage), FillColor)
        Case 32
            DrawingMode(#PB_2DDrawing_AlphaChannel)  
            Box(0, 0, ImageWidth(nImage), ImageHeight(nImage), $00) ; full transparent
    EndSelect
  EndIf
 
  *AllocMem = AllocateMemory(BufferPitch * ImageHeight(nImage))
 
  If *AllocMem
    CopyMemory(*ImageMem, *AllocMem, MemorySize(*AllocMem))
    *BufferPitch\i = BufferPitch
  Else
    *BufferPitch\i = 0
  EndIf
 
 StopDrawing()
 
 ProcedureReturn *AllocMem
EndProcedure
 
Procedure CopyImageData (nImage, *DestMem)
 StartDrawing(ImageOutput(nImage))
  CopyMemory(*DestMem, DrawingBuffer(), MemorySize(*DestMem))
 StopDrawing()
EndProcedure
 
Procedure.i RotateImage (nSrcImage, DegRot)
 
; Rotate 24 bit images at (+/-) 90/180/270 degrees
 
; Rotate 32 bit images at (+/-) 90/180/270 degrees preserving the alpha-channel
 
 Protected *tRGBAs.T_RGBA, *tRGBAd.T_RGBA, tPixel.T_RGBA, RotType
 Protected *SrcMem, *DestMem, BufferPitchSrc, BufferPitchDest
 Protected SrcWidth, SrcHeight, DestWidth, DestHeight, nDestImage
 Protected X, Y, Xs, Ys
 Protected BitPlanes
 
 ; sanity checks
 
 If IsImage(nSrcImage) = 0
    ProcedureReturn 0
 EndIf
 
 BitPlanes = ImageDepth(nSrcImage)
 
 If BitPlanes <> 24 And BitPlanes <> 32
    ProcedureReturn 0
 EndIf
 
 If DegRot % 90
    ProcedureReturn 0
 EndIf
 
 DegRot % 360
 
 If DegRot = 0
    ProcedureReturn CopyImage(nSrcImage, #PB_Any)
 EndIf
 
 CompilerIf (#PB_Compiler_OS = #PB_OS_Linux)
  DegRot = -DegRot
 CompilerEndIf
 
 SrcWidth = ImageWidth(nSrcImage)
 SrcHeight = ImageHeight(nSrcImage)
 
 Select DegRot            
    Case 90, -270
        DestWidth = SrcHeight
        DestHeight = SrcWidth
        RotType = 1
    Case 180, -180
        RotType = 2
        DestWidth = SrcWidth
        DestHeight = SrcHeight
    Case 270, -90
        RotType = 3
        DestWidth = SrcHeight
        DestHeight = SrcWidth
 EndSelect
 
 ; create 24/32 bit destination image
 nDestImage = CreateImage(#PB_Any, DestWidth, DestHeight, BitPlanes)
 TRY (nDestImage)
 
 ; copy src image to allocated memory
 *SrcMem = AllocateImageData(nSrcImage, @BufferPitchSrc)
 TRY (*SrcMem, #EXC_ALLOC_ERR)
 
 ; copy dest image to allocated memory
 *DestMem = AllocateImageData(nDestImage, @BufferPitchDest)
 TRY (*DestMem, #EXC_ALLOC_ERR)
 
 Select BitPlanes
    Case 24
        For Y = 0 To DestHeight - 1
            For X = 0 To DestWidth - 1
           
                Select RotType
                    Case 1
                        Ys = SrcHeight - X - 1
                        Xs = Y
                    Case 2
                        Ys = SrcHeight - Y - 1
                        Xs = SrcWidth - X - 1  
                    Case 3
                        Ys = X
                        Xs = SrcWidth - Y - 1
                EndSelect
 
                CopyPixel24 (Xs, Ys, X, Y, BufferPitchSrc, BufferPitchDest, *tRGBAs, *tRGBAd, *SrcMem, *DestMem)
                           
            Next
         Next  
    Case 32
        For Y = 0 To DestHeight - 1
            For X = 0 To DestWidth - 1
           
                Select RotType
                    Case 1
                        Ys = SrcHeight - X - 1
                        Xs = Y
                    Case 2
                        Ys = SrcHeight - Y - 1
                        Xs = SrcWidth - X - 1  
                    Case 3
                        Ys = X
                        Xs = SrcWidth - Y - 1
                EndSelect
 
                CopyPixel32 (Xs, Ys, X, Y, BufferPitchSrc, BufferPitchDest, *tRGBAs, *tRGBAd, *SrcMem, *DestMem)                  
                           
            Next
         Next  
 EndSelect
 
 CopyImageData(nDestImage, *DestMem)
   
 FreeMemory(*SrcMem)
 FreeMemory(*DestMem)
 
 ProcedureReturn nDestImage
 
 CATCH()
 
 If EXCEPTION = #EXC_ALLOC_ERR
    If *SrcMem <> 0 : FreeMemory(*SrcMem) : EndIf
    If *DestMem <> 0 : FreeMemory(*DestMem) : EndIf    
    FreeImage(nDestImage)
 EndIf
 
 ProcedureReturn 0
EndProcedure
 
 
Procedure.i RotateImageFree (nSrcImage, fDegRot.f, flgAntiAliasing, FillColor = $ffffff)
; Rotates 24 bit images at any angle optionally with anti-aliasing filling the new area of the resulting image with the specified color.
 
; Rotates 32 bit images at any angle optionally with anti-aliasing preserving the alpha-channel.
 
 Protected *tRGBAs.T_RGBA, *tRGBAd.T_RGBA, tPixel.T_RGBA
 Protected *SrcMem, *DestMem, BufferPitchSrc, BufferPitchDest
 Protected fzCos.f, fzSin.f
 Protected SrcWidth, SrcHeight, DestWidth, DestHeight, BitPlanes, nDestImage
 Protected X, Y, Xs, Ys, Xc1, Yc1, Xc2, Yc2, iColor
 Protected XRoundFix, YRoundFix
 
 ; sanity checks
 If IsImage(nSrcImage) = 0
    ProcedureReturn 0
 EndIf
 
 BitPlanes = ImageDepth(nSrcImage)
 
 If BitPlanes <> 24 And BitPlanes <> 32
    ProcedureReturn 0
 EndIf
 
 If fDegRot >= 360.0 ; wrap it
    fDegRot = 360.0 * (fDegRot / 360.0 - Int(fDegRot / 360.0))
 EndIf
 
 If fDegRot = 0.0 Or fDegRot = 90.0 Or fDegRot = 180.0 Or fDegRot = 270.0
    ProcedureReturn RotateImage(nSrcImage, fDegRot)
 EndIf
 
 If fDegRot > 270.0
    XRoundFix = -1
    YRoundFix = 0    
 ElseIf fDegRot > 180.0
    XRoundFix = -1
    YRoundFix = -1
 Else
    XRoundFix = 0
    YRoundFix = -1
 EndIf
 
 CompilerIf (#PB_Compiler_OS = #PB_OS_Linux)
 fDegRot = -fDegRot
 CompilerEndIf
 
 fzCos = Cos(Radian(fDegRot))
 fzSin = Sin(Radian(fDegRot))
 
 SrcWidth = ImageWidth(nSrcImage)
 SrcHeight = ImageHeight(nSrcImage)
 
 DestWidth = Round(SrcWidth * Abs(fzCos) + SrcHeight * Abs(fzSin) + 1.0, #PB_Round_Up)
 DestHeight = Round(SrcHeight * Abs(fzCos) + SrcWidth * Abs(fzSin) + 1.0, #PB_Round_Up)
 
 Xc1 = SrcWidth / 2
 Yc1 = SrcHeight / 2
 Xc2 = DestWidth / 2
 Yc2 = DestHeight / 2
 
 ; create 24/32 bit destination image
 nDestImage = CreateImage(#PB_Any, DestWidth, DestHeight, BitPlanes)
 TRY (nDestImage)
 
 ; copy src image to allocated memory
 *SrcMem = AllocateImageData (nSrcImage, @BufferPitchSrc)
 TRY (*SrcMem, #EXC_ALLOC_ERR)
 
 ; copy dest image to allocated memory and fill with backcolor
 *DestMem = AllocateImageData(nDestImage, @BufferPitchDest, FillColor)
 TRY (*DestMem, #EXC_ALLOC_ERR)
     
 Select flgAntiAliasing
 
    Case #False  
   
        Select BitPlanes
            Case 24
     
                For Y = 0 To DestHeight - 1
                    For X = 0 To DestWidth - 1
                   
                        ; For each nDestImage point find rotated nSrcImage source point
                        Xs = Xc1 + (X - Xc2) * fzCos + (Y - Yc2) * fzSin + XRoundFix
                        Ys = Yc1 + (Y - Yc2) * fzCos - (X - Xc2) * fzSin + YRoundFix
                                   
                        If Xs >= 0 And Xs < SrcWidth  And Ys >= 0 And Ys < SrcHeight
                            ; Move valid rotated nSrcImage source points to nDestImage                  
                            CopyPixel24 (Xs, Ys, X, Y, BufferPitchSrc, BufferPitchDest, *tRGBAs, *tRGBAd, *SrcMem, *DestMem)
                        EndIf
                                   
                    Next
                Next  
           
            Case 32
           
                For Y = 0 To DestHeight - 1
                    For X = 0 To DestWidth - 1
                        ; For each nDestImage point find rotated nSrcImage source point
                        Xs = Xc1 + (X - Xc2) * fzCos + (Y - Yc2) * fzSin + XRoundFix
                        Ys = Yc1 + (Y - Yc2) * fzCos - (X - Xc2) * fzSin + YRoundFix
                                   
                        If Xs >= 0 And Xs < SrcWidth  And Ys >= 0 And Ys < SrcHeight
                            ; Move valid rotated nSrcImage source points to nDestImage                  
                            CopyPixel32 (Xs, Ys, X, Y, BufferPitchSrc, BufferPitchDest, *tRGBAs, *tRGBAd, *SrcMem, *DestMem)
                        EndIf
                                   
                    Next
                Next  
                                     
        EndSelect
         
    Case #True
   
        Protected Xs0, Ys0, icr, icg, icb, icr0, icg0, icb0, icr1, icg1, icb1
        Protected fXs.f, fYs.f, fXfs1.f, fYfs1.f
        Protected fXfs1less.f, fYfs1less.f
 
        Select BitPlanes
           
            Case 24
           
                For Y = 0 To DestHeight - 1
                    For X = 0 To DestWidth - 1
           
                        ; For each nDestImage point find rotated nSrcImage source point
                        fXs = Xc1 + (X - Xc2) * fzCos + (Y - Yc2) * fzSin + XRoundFix
                        fYs = Yc1 + (Y - Yc2) * fzCos - (X - Xc2) * fzSin + YRoundFix
             
                        ; Bottom left coords of bounding floating point rectangle on nSrcImage
                        Xs0 = Int(fXs)  
                        Ys0 = Int(fYs)
                           
                        If Xs0 >= 0 And Xs0 <= SrcWidth -1 And Ys0 >= 0 And Ys0 <= SrcHeight - 1                      
                            fXfs1 = fXs - Int(fXs)
                            fYfs1 = fYs - Int(fYs)
       
                            fXfs1less = 1 - fXfs1 - 0.000005 : If fXfs1less < 0 : fXfs1less = 0 : EndIf
                            fYfs1less = 1 - fYfs1 - 0.000005 : If fYfs1less < 0 : fYfs1less = 0 : EndIf
                                                                     
                            ReadPixel24 (Xs0, Ys0, BufferPitchSrc, *tRGBAs, *SrcMem)                                                                                                                              
                            icr = *tRGBAs\R * fXfs1less
                            icg = *tRGBAs\G * fXfs1less
                            icb = *tRGBAs\B * fXfs1less
                               
                            ReadPixel24 (Xs0 + 1, Ys0, BufferPitchSrc, *tRGBAs, *SrcMem)
                            icr0 = *tRGBAs\R * fXfs1 + icr
                            icg0 = *tRGBAs\G * fXfs1 + icg
                            icb0 = *tRGBAs\B * fXfs1 + icb
                                 
                            ReadPixel24 (Xs0, Ys0 + 1, BufferPitchSrc, *tRGBAs, *SrcMem)
                            icr = *tRGBAs\R * fXfs1less
                            icg = *tRGBAs\G * fXfs1less
                            icb = *tRGBAs\B * fXfs1less
                                                                       
                            ReadPixel24 (Xs0 + 1, Ys0 + 1, BufferPitchSrc, *tRGBAs, *SrcMem)
                            icr1 = *tRGBAs\R * fXfs1 + icr
                            icg1 = *tRGBAs\G * fXfs1 + icg
                            icb1 = *tRGBAs\B * fXfs1 + icb
                   
                            ; Weight along axis Y
                            tPixel\R = fYfs1less * icr0 + fYfs1 * icr1
                            tPixel\G = fYfs1less * icg0 + fYfs1 * icg1
                            tPixel\B = fYfs1less * icb0 + fYfs1 * icb1                          
                           
                            WritePixel24 (tPixel, X, Y, BufferPitchDest, *tRGBAd, *DestMem)                              
                        EndIf          
                    Next
                Next          
           
            Case 32
 
                Protected ica, ica0, ica1
               
                For Y = 0 To DestHeight - 1
                    For X = 0 To DestWidth - 1
           
                        ; For each nDestImage point find rotated nSrcImage source point
                        fXs = Xc1 + (X - Xc2) * fzCos + (Y - Yc2) * fzSin + XRoundFix
                        fYs = Yc1 + (Y - Yc2) * fzCos - (X - Xc2) * fzSin + YRoundFix
             
                        ; Bottom left coords of bounding floating point rectangle on nSrcImage
                        Xs0 = Int(fXs)  
                        Ys0 = Int(fYs)                      
 
                        If Xs0 >= 0 And Xs0 <= SrcWidth - 1 And Ys0 >= 0 And Ys0 < SrcHeight - 1
                       
                            fXfs1 = fXs - Int(fXs)
                            fYfs1 = fYs - Int(fYs)
       
                            fXfs1less = 1 - fXfs1 - 0.000005 : If fXfs1less < 0 : fXfs1less = 0 : EndIf
                            fYfs1less = 1 - fYfs1 - 0.000005 : If fYfs1less < 0 : fYfs1less = 0 : EndIf
                                                                     
                            ReadPixel32 (Xs0, Ys0, BufferPitchSrc, *tRGBAs, *SrcMem)                                                                                                                                                      
                            icr = *tRGBAs\R * fXfs1less
                            icg = *tRGBAs\G * fXfs1less
                            icb = *tRGBAs\B * fXfs1less
                            ica = *tRGBAs\A * fXfs1less
                                                           
                            ReadPixel32 (Xs0 + 1, Ys0, BufferPitchSrc, *tRGBAs, *SrcMem)
                            icr0 = *tRGBAs\R * fXfs1 + icr
                            icg0 = *tRGBAs\G * fXfs1 + icg
                            icb0 = *tRGBAs\B * fXfs1 + icb
                            ica0 = *tRGBAs\A * fXfs1 + ica
                                                             
                            ReadPixel32 (Xs0, Ys0 + 1, BufferPitchSrc, *tRGBAs, *SrcMem)
                            icr = *tRGBAs\R * fXfs1less
                            icg = *tRGBAs\G * fXfs1less
                            icb = *tRGBAs\B * fXfs1less
                            ica = *tRGBAs\A * fXfs1less
                                                                                                   
                            ReadPixel32 (Xs0 + 1, Ys0 + 1, BufferPitchSrc, *tRGBAs, *SrcMem)
                            icr1 = *tRGBAs\R * fXfs1 + icr
                            icg1 = *tRGBAs\G * fXfs1 + icg
                            icb1 = *tRGBAs\B * fXfs1 + icb
                            ica1 = *tRGBAs\A * fXfs1 + ica
                                               
                            ; Weight along axis Y
                            tPixel\R = fYfs1less * icr0 + fYfs1 * icr1
                            tPixel\G = fYfs1less * icg0 + fYfs1 * icg1
                            tPixel\B = fYfs1less * icb0 + fYfs1 * icb1
                            tPixel\A = fYfs1less * ica0 + fYfs1 * ica1                          
                           
                            WritePixel32 (tPixel, X, Y, BufferPitchDest, *tRGBAd, *DestMem)
                        EndIf          
                    Next
                Next          
 
        EndSelect
 EndSelect
 
 CopyImageData(nDestImage, *DestMem)
   
 FreeMemory(*SrcMem)
 FreeMemory(*DestMem)
 
 ProcedureReturn nDestImage
 
 CATCH()
 
 If EXCEPTION = #EXC_ALLOC_ERR
    If *SrcMem <> 0 : FreeMemory(*SrcMem) : EndIf
    If *DestMem <> 0 : FreeMemory(*DestMem) : EndIf
    FreeImage(nDestImage)
 EndIf
 
 ProcedureReturn 0
EndProcedure
 
 
Procedure.i FlipImage (nSrcImage)
 
; Flip vertically a 24/32 bit image preserving the alpha-channel
 
 Protected *tRGBAs.T_RGBA, *tRGBAd.T_RGBA, tPixel.T_RGBA, RotType
 Protected *SrcMem, *DestMem, BufferPitchSrc, BufferPitchDest
 Protected SrcWidth, SrcHeight, DestWidth, DestHeight, nDestImage
 Protected X, Y
 Protected BitPlanes
   
 ; sanity checks
 If IsImage(nSrcImage) = 0
    ProcedureReturn 0
 EndIf
 
 BitPlanes = ImageDepth(nSrcImage)
 
 If BitPlanes <> 24 And BitPlanes <> 32
    ProcedureReturn 0
 EndIf
 
 SrcWidth = ImageWidth(nSrcImage)
 SrcHeight = ImageHeight(nSrcImage)
 
 DestWidth = SrcWidth
 DestHeight = SrcHeight
 
 ; create 24/32 bit destination image
 nDestImage = CreateImage(#PB_Any, DestWidth, DestHeight, BitPlanes)
 TRY (nDestImage)
 
 ; copy src image to allocated memory
 *SrcMem = AllocateImageData(nSrcImage, @BufferPitchSrc)
 TRY (*SrcMem, #EXC_ALLOC_ERR)
 
 ; copy dest image to allocated memory
 *DestMem = AllocateImageData(nDestImage, @BufferPitchDest)
 TRY (*DestMem, #EXC_ALLOC_ERR)
 
 Select BitPlanes
    Case 24
        For Y = 0 To DestHeight - 1
            For X = 0 To DestWidth - 1          
                CopyPixel24 (X, SrcHeight - Y - 1, X, Y, BufferPitchSrc, BufferPitchDest, *tRGBAs, *tRGBAd, *SrcMem, *DestMem)
            Next
         Next      
    Case 32
        For Y = 0 To DestHeight - 1
            For X = 0 To DestWidth - 1          
                CopyPixel32 (X, SrcHeight - Y - 1, X, Y, BufferPitchSrc, BufferPitchDest, *tRGBAs, *tRGBAd, *SrcMem, *DestMem)
            Next
         Next  
 EndSelect
 
 CopyImageData(nDestImage, *DestMem)
 
 FreeMemory(*SrcMem)
 FreeMemory(*DestMem)
 
 ProcedureReturn nDestImage
 
 CATCH()
 
 If EXCEPTION = #EXC_ALLOC_ERR
    If *SrcMem <> 0 : FreeMemory(*SrcMem) : EndIf
    If *DestMem <> 0 : FreeMemory(*DestMem) : EndIf    
    FreeImage(nDestImage)
 EndIf
 
 ProcedureReturn 0
EndProcedure
 
Procedure.i MirrorImage (nSrcImage)
 
; Mirror horizontally a 24/32 bit image preserving the alpha-channel
 
 Protected *tRGBAs.T_RGBA, *tRGBAd.T_RGBA, tPixel.T_RGBA, RotType
 Protected *SrcMem, *DestMem, BufferPitchSrc, BufferPitchDest, BitPlanes
 Protected SrcWidth, SrcHeight, DestWidth, DestHeight, nDestImage
 Protected X, Y
 
 ; sanity checks
 If IsImage(nSrcImage) = 0
    ProcedureReturn 0
 EndIf
 
 BitPlanes = ImageDepth(nSrcImage)
 
 If BitPlanes <> 24 And BitPlanes <> 32
    ProcedureReturn 0
 EndIf
 
 SrcWidth = ImageWidth(nSrcImage)
 SrcHeight = ImageHeight(nSrcImage)
 
 DestWidth = SrcWidth
 DestHeight = SrcHeight
 
 ; create 24/32 bit destination image
 nDestImage = CreateImage(#PB_Any, DestWidth, DestHeight, BitPlanes)
 TRY (nDestImage)
 
 ; copy src image to allocated memory
 *SrcMem = AllocateImageData(nSrcImage, @BufferPitchSrc)
 TRY (*SrcMem, #EXC_ALLOC_ERR)
 
 ; copy dest image to allocated memory
 *DestMem = AllocateImageData(nDestImage, @BufferPitchDest)
 TRY (*DestMem, #EXC_ALLOC_ERR)
 
 Select BitPlanes
    Case 24
        For Y = 0 To DestHeight - 1
            For X = 0 To DestWidth - 1
                CopyPixel24 (SrcWidth - X - 1, Y, X, Y, BufferPitchSrc, BufferPitchDest, *tRGBAs, *tRGBAd, *SrcMem, *DestMem)    
            Next
        Next  
    Case 32
        For Y = 0 To DestHeight - 1
            For X = 0 To DestWidth - 1
                CopyPixel32 (SrcWidth - X - 1, Y, X, Y, BufferPitchSrc, BufferPitchDest, *tRGBAs, *tRGBAd, *SrcMem, *DestMem)    
            Next
        Next  
 EndSelect
 
 CopyImageData(nDestImage, *DestMem)
 
 FreeMemory(*SrcMem)
 FreeMemory(*DestMem)
 
 ProcedureReturn nDestImage
   
 CATCH()
 
 If EXCEPTION = #EXC_ALLOC_ERR  
    If *SrcMem <> 0 : FreeMemory(*SrcMem) : EndIf
    If *DestMem <> 0 : FreeMemory(*DestMem) : EndIf        
    FreeImage(nDestImage)
 EndIf
 
 ProcedureReturn 0
EndProcedure



я попытался его применить:
Код:
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
80
81
82
83
84
85
86
87
88
89
90
91
92
93
Enumeration
  #GFXWindow
  #GFXEditorGad
 
  #But1
  #But2
 
  #TmpImage
EndEnumeration
 
Structure pic
  main.l
  mirr.l
EndStructure
Global Dim PicArr.pic(2)
 
XIncludeFile "RotateImage.pb"
 
Procedure DrawBlock(text$, num.a)
 
  If IsImage(PicArr(num)\main)
    FreeImage(PicArr(num)\main)
  EndIf
  PicArr(num)\main = CreateImage(#PB_Any, 8, 8, 32)
  ;CreateImage(#TmpImage, 8, 8, 32)
 
  If StartDrawing(ImageOutput(PicArr(num)\main))
  ;If StartDrawing(ImageOutput(#TmpImage))
    DrawText(0, 0, text$)
    StopDrawing()
  EndIf
 
  ;If IsImage(PicArr(num))
  ;  FreeImage(PicArr(num))
  ;EndIf
 
  ;PicArr(num)\main = CopyImage(#TmpImage, #PB_Any)
 
  ;FreeImage(#TmpImage)
 
EndProcedure
 
Procedure DrawFullImage(text$, num)
 
  DrawBlock(text$, num)
 
  If IsImage(PicArr(num)\mirr)    
    FreeImage(PicArr(num)\mirr)
  EndIf
  PicArr(num)\mirr = CopyImage(PicArr(num)\main, #PB_Any)
  ;CopyImage(PicArr(num)\main, PicArr(num)\mirr)          ; crit
 
  ; commenting this string is stop memory leak
  PicArr(num)\mirr = MirrorImage(PicArr(num)\mirr)
 
  If StartDrawing(CanvasOutput(#GFXEditorGad))
   
    DrawAlphaImage(ImageID(PicArr(num)\main), 0, 0)
   
    DrawAlphaImage(ImageID(PicArr(num)\mirr), 16, 0)
   
    StopDrawing()
  EndIf
 
EndProcedure
 
If OpenWindow(#GFXWindow, 100, 200, 500, 360, "PureBasic Window", #PB_Window_SystemMenu | #PB_Window_MinimizeGadget | #PB_Window_MaximizeGadget)
 
  CanvasGadget(#GFXEditorGad, 10, 10, 32, 32)
 
  ButtonGadget(#But1, 10, 50, 20, 20, "")
 
  ButtonGadget(#But2, 60, 50, 20, 20, "")
 
  Repeat
    Event = WaitWindowEvent()
   
    Select Event
      Case #PB_Event_Gadget
        EvGadget = EventGadget()
        Select EvGadget
          Case #But1
            DrawFullImage("1", 1)
          Case #But2
            DrawFullImage("2", 2)
        EndSelect
      Case #PB_Event_CloseWindow  ; If the user has pressed on the close button
        Quit = 1
    EndSelect
 
  Until Quit = 1
 
EndIf



и что-то затык в том, что если смотреть в диспетчере задач - то каждое нажатие кнопки увеличивает объем памяти. оно вобще у меня увеличивалось и без этих процедур зеркалирования, когда я рисовал во временную картинку, которую потом копировал с помощью #PB_Any - но я вроде бы это победил, рисуя сразу в массив и утечка пропала. но теперь появилась когда эту процедуру добавил для зеркалирования.


Вернуться наверх
 Профиль  
 
СообщениеДобавлено: Сб сен 09, 2017 6:30 am 
Не в сети
профессор

Зарегистрирован: Вт май 13, 2014 4:12 am
Сообщений: 521
Благодарил (а): 51 раз.
Поблагодарили: 15 раз.
Пункты репутации: 5
тут можно нарваться, проверяй создание
Код:
1
2
3
4
5
6
7
  PicArr(num)\main = CreateImage(#PB_Any, 8, 8, 32)
  ;CreateImage(#TmpImage, 8, 8, 32)
 
  if PicArr(num)\main
  If StartDrawing(ImageOutput(PicArr(num)\main))
endif
 



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


Вернуться наверх
 Профиль  
 
СообщениеДобавлено: Сб сен 09, 2017 8:23 am 
Не в сети
профессор

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

вот теперь вроде не подтекает :)
Код:
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
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
Enumeration
  #GFXWindow
  #GFXEditorGad
 
  #But1
  #But2
EndEnumeration
 
Structure pic
  main.l
  mirr.l
EndStructure
Global Dim PicArr.pic(2)
 
XIncludeFile "DUEmodules\RotateImage.pb"
 
Procedure DrawBlock(text$, num.a)
 
  If IsImage(PicArr(num)\main)
    FreeImage(PicArr(num)\main)
  EndIf
  PicArr(num)\main = CreateImage(#PB_Any, 8, 8, 32)
 
  ; если создалось...
  If PicArr(num)\main
   
    ; начать рисовать
    If StartDrawing(ImageOutput(PicArr(num)\main))
      DrawText(0, 0, text$)
      StopDrawing()
    EndIf
   
  EndIf
 
EndProcedure
 
Procedure DrawFullImage(text$, num)
 
  DrawBlock(text$, num)
 
  ; если создалось повторная проверка
  If PicArr(num)\main
   
    ; освободить, если было старое изображение здесь
    If IsImage(PicArr(num)\mirr)    
      FreeImage(PicArr(num)\mirr)
    EndIf
   
    ; записать зеркальное изображение во временную карткну
    tmp = MirrorImage(PicArr(num)\main)
   
    ; отзеркалить в другом направлении
    PicArr(num)\mirr = FlipImage(tmp)
   
    ; освободить временную
    FreeImage(tmp)
   
    ; начать рисовать полученные изображения.
    ; хотя наверное надо еще предварительно проверить результат зеркалирования
    If StartDrawing(CanvasOutput(#GFXEditorGad))
   
      DrawAlphaImage(ImageID(PicArr(num)\main), 0, 0)
   
      DrawAlphaImage(ImageID(PicArr(num)\mirr), 16, 0)
   
      StopDrawing()
    EndIf
  EndIf
 
EndProcedure
 
If OpenWindow(#GFXWindow, 100, 200, 500, 360, "PureBasic Window", #PB_Window_SystemMenu | #PB_Window_MinimizeGadget | #PB_Window_MaximizeGadget)
 
  CanvasGadget(#GFXEditorGad, 10, 10, 32, 32)
 
  ButtonGadget(#But1, 10, 50, 20, 20, "")
 
  ButtonGadget(#But2, 60, 50, 20, 20, "")
 
  Repeat
    Event = WaitWindowEvent()
   
    Select Event
      Case #PB_Event_Gadget
        EvGadget = EventGadget()
        Select EvGadget
          Case #But1
            DrawFullImage("1", 1)
          Case #But2
            DrawFullImage("2", 2)
        EndSelect
      Case #PB_Event_CloseWindow  ; If the user has pressed on the close button
        Quit = 1
    EndSelect
 
  Until Quit = 1
 
EndIf



Вернуться наверх
 Профиль  
 
СообщениеДобавлено: Вт окт 17, 2017 7:31 pm 
Не в сети
профессор

Зарегистрирован: Пт фев 20, 2009 12:57 pm
Сообщений: 1547
Откуда: Алматы
Благодарил (а): 11 раз.
Поблагодарили: 36 раз.
Пункты репутации: 5
в оригинале картинка скажем 32х32. но вывожу в канвасный гаджет после увеличения в 5 раз. и решил при рисовании кисточкой на этом канвасе - рисовать не в картинку, а прям в канвас. когда ты цвет выбрал и мышкой елозишь по канвасу - путем drawimage рисуется основное изображение и на него box цвета. с этим проблем нет. но тут ты решил шлепнуть этот цвет в такие-то координаты. в массив цветов изображения то вносится, тут тоже проблем нет. но не хотелось бы все изображение перерисовывать по новой. а прям взять то временное изображение, которое в канвасе с уже нужным цветом в нужных координатах - как при передвижении мышки - но сделать его постоянным. так вот нельзя ли из канваса как-то закатчить изображение? второй момент почему был выбран канвас в качестве вывода, а не второе "временное" изображение - это то что это временное изображение надо будет каждый раз освобождать перед перерисовкой. в случае с канвасом рисуй себе и рисуй освобождать его не надо.

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


оказалось замудрено :)
http://www.purebasic.fr/english/viewtop ... 13&t=61339
Код:
1
2
3
4
5
imagein = GetGadgetAttribute(0,#PB_Canvas_Image)
imgOut = CreateImage(#PB_Any, 320, 240)
StartDrawing(ImageOutput(imgOut))
  DrawImage(imagein,0,0)
StopDrawing()



Вернуться наверх
 Профиль  
 
СообщениеДобавлено: Ср окт 18, 2017 7:40 am 
Не в сети
профессор

Зарегистрирован: Вт май 13, 2014 4:12 am
Сообщений: 521
Благодарил (а): 51 раз.
Поблагодарили: 15 раз.
Пункты репутации: 5
SereZa писал(а):
оказалось замудрено

другого нет :D

у меня вопрос вылез по ходу использования этого кода, мне в файл нужно было сохранять
Код:
1
imagein = GetGadgetAttribute(0,#PB_Canvas_Image)


вот что здесь происходит, делается копия или напрямую переливается???
судя по описанию в справке, копию не делают, но я на всякий случай удалял
так есть копия в памяти или нет? надо удалять или нет?


Вернуться наверх
 Профиль  
 
СообщениеДобавлено: Ср окт 18, 2017 9:02 am 
Не в сети
профессор
Аватар пользователя

Зарегистрирован: Чт июн 25, 2009 1:02 pm
Сообщений: 2227
Откуда: Russia — Belarus
Благодарил (а): 0 раз.
Поблагодарили: 65 раз.
Пункты репутации: 11
Судя по всему, там ничего не преливается и не копируется. Просто в imagein записывается адрес BITMAP'а Canvas'а. А этот самый BITMAP существует и до вызова этой строки.

_________________
EnableExplicit User


Вернуться наверх
 Профиль  
 
СообщениеДобавлено: Ср окт 18, 2017 12:00 pm 
Не в сети
профессор

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


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


Вернуться наверх
 Профиль  
 
СообщениеДобавлено: Ср окт 18, 2017 11:56 pm 
Не в сети
профессор

Зарегистрирован: Пн июл 22, 2013 11:00 pm
Сообщений: 531
Благодарил (а): 2 раз.
Поблагодарили: 29 раз.
Пункты репутации: 9
SereZa писал(а):
в той теме товарищ буржуй давал какие-то пояснения другому буржую... но я не владею в совершенстве буржуйским и чего они там обсуждали - не очень понимаю :) по идее если запустить в цикле повтор вывода и чтения изображения и посмотреть на количество занятой памяти будет видно есть утечка или нету.


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

Нормальный код в моём понимании не тот что обрабатывает алгоритм больше раза без некоего события,где действительно есть сценарий изменения чего либо в входящих данных,а не тупо каждый раз перебирать всё заново.. :roll:
PS:Можно и без события проверить конечно но это в случаи сомнения,а оно в чужих алгоритмах и их не допонимании конечно есть безусловно всегда


Вернуться наверх
 Профиль  
 
Показать сообщения за:  Сортировать по:  
Начать новую тему Ответить на тему  [ Сообщений: 78 ]  На страницу Пред.  1, 2, 3, 4, 5, 6  След.

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


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

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


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

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