Моя тупость vs Image

Язык Visual Basic на платформе .NET.

Модераторы: Ramzes, Sebas

MIT
Мега гуру
Мега гуру
Аватара пользователя
 
Сообщения: 2211
Зарегистрирован: 17.09.2006 (Вс) 22:46

Моя тупость vs Image

Сообщение MIT » 04.01.2009 (Вс) 20:52

В классе Array есть замечательная процедура - ConstrainedCopy(ByVal sourceArray As System.Array, ByVal sourceIndex As Integer, ByVal destinationArray As System.Array, ByVal destinationIndex As Integer, ByVal length As Integer), позволяющая переместить (или скопировать) часть массива (аналог CopyMemory). Но у нее есть один минус - она работает только с типами-примитивами. В этом и состоит основная загвоздка.
Аналогичная процедура BlockCopy класса System.Buffer так же работает только с примитивами.
Собственно в чем вопрос: как работать с массивом элементов Image?

Так как Image строится на основе Object`а (Image >> System.MarshalByRefObject >> System.Object), то, соответственно нужна поддержка Object.

Хотя System.MarshalByRefObject наталкивает на мысль, что может помочь функционал System.Runtime.InteropServices.Marshal, но я с ним никогда раньше не работал.


added: Тема переименована. Изначальное название - "ConstrainedCopy для Image()"
Последний раз редактировалось MIT 05.01.2009 (Пн) 19:02, всего редактировалось 1 раз.
Изображение
You can change your face, but can`t change your mind. No matter what you do.
Создайте еще более понятный интерфейс и мир создаст еще более тупого юзера. (с) Баш

ANDLL
Великий гастроном
Великий гастроном
Аватара пользователя
 
Сообщения: 3450
Зарегистрирован: 29.06.2003 (Вс) 18:55

Re: ConstrainedCopy для Image()

Сообщение ANDLL » 04.01.2009 (Вс) 21:27

Но у нее есть один минус - она работает только с типами-примитивами
ConstrainedCopy работает не только с типами-примитивами
Гастрономия - наука о пище, о ее приготовлении, употреблении, переварении и испражнении.
Блог

MIT
Мега гуру
Мега гуру
Аватара пользователя
 
Сообщения: 2211
Зарегистрирован: 17.09.2006 (Вс) 22:46

Re: ConstrainedCopy для Image()

Сообщение MIT » 04.01.2009 (Вс) 21:29

Спорить не буду, но факт - она не работает с Image`ами.
Изображение
You can change your face, but can`t change your mind. No matter what you do.
Создайте еще более понятный интерфейс и мир создаст еще более тупого юзера. (с) Баш

ANDLL
Великий гастроном
Великий гастроном
Аватара пользователя
 
Сообщения: 3450
Зарегистрирован: 29.06.2003 (Вс) 18:55

Re: ConstrainedCopy для Image()

Сообщение ANDLL » 04.01.2009 (Вс) 22:04

Нет такого факта, у тебя просто кривые руки. Покажи код.
Гастрономия - наука о пище, о ее приготовлении, употреблении, переварении и испражнении.
Блог

Williams
Гуру
Гуру
Аватара пользователя
 
Сообщения: 1280
Зарегистрирован: 06.05.2008 (Вт) 18:35
Откуда: System.Reflection.Williams (увидел себя в зеркале :))

Re: ConstrainedCopy для Image()

Сообщение Williams » 05.01.2009 (Пн) 14:20

Там где нельзя Image, можно выполнить несложную технику кодерского карате Image > Stream > ToArray
И вы думаете, что вас оставят в живых после прочтения этого поста?

MIT
Мега гуру
Мега гуру
Аватара пользователя
 
Сообщения: 2211
Зарегистрирован: 17.09.2006 (Вс) 22:46

Re: ConstrainedCopy для Image()

Сообщение MIT » 05.01.2009 (Пн) 18:57

ANDLL писал(а):у тебя просто кривые руки
:cry:

ANDLL писал(а):Покажи код
На:
Код: Выделить всё
        Private _ImgArr() As Image
...
Private Sub ...
...
        Array.ConstrainedCopy(_ImgArr, OldIndex + 1, _ImgArrL, OldIndex, _ImgArr.Length - OldIndex - 1)
        ReDim Preserve _ImgArr(_ImgArr.Length - 2)
...
End sub

OldIndex - удаляемый индекс
Ругается о следующем:
Array.ConstrainedCopy will only work on array types that are provably compatible, without any form of boxing, unboxing, widening, or casting of each array element. Change the array types (i.e., copy a Derived[] to a Base[]), or use a mitigation strategy in the CER for Array.Copy's less powerful reliability contract, such as cloning the array or throwing away the potentially corrupt destination array.


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


Added: Блииииин, убейте меня за невнимательность... Очепятку не заметил: ImgArrL, а надо ImgArr. Е-мое... да, рановато зарекся про отсутствие идиотизма... :oops:

Ладно. Не пропадать же теме. Задам тогда смежный вопрос:
Есть объект Image (пусть он лежит в массиве - не принципиально); есть процедура, которая в отдельном потоке этот Image рисует. Как в процедуру передать ссылку на объект? У меня несколько идей:
1) ByRef
2) Ничего не надо, просто передаем Image, а так как он является MarshalByRefObject`ом, то вместо картинки автоматически передается ссылка на объект
3) Что-нибудь очень умное с указателями
Я почему-то склояюсь ко 2ому варианту. как правильно?
Изображение
You can change your face, but can`t change your mind. No matter what you do.
Создайте еще более понятный интерфейс и мир создаст еще более тупого юзера. (с) Баш

ANDLL
Великий гастроном
Великий гастроном
Аватара пользователя
 
Сообщения: 3450
Зарегистрирован: 29.06.2003 (Вс) 18:55

Re: Моя тупость vs Image

Сообщение ANDLL » 05.01.2009 (Пн) 19:09

4) (и правильное) ByVal
Гастрономия - наука о пище, о ее приготовлении, употреблении, переварении и испражнении.
Блог

MIT
Мега гуру
Мега гуру
Аватара пользователя
 
Сообщения: 2211
Зарегистрирован: 17.09.2006 (Вс) 22:46

Re: Моя тупость vs Image

Сообщение MIT » 05.01.2009 (Пн) 19:19

Ну, под 2ым я это и подразумевал.
2 ANDLL: Спасибо (за терпение в частности :wink: )

Там где нельзя Image, можно выполнить несложную технику кодерского карате Image > Stream > ToArray

Наверно это не совсем верно, да и медленно. Но как вариант - тоже мысль. Спасибо.
Изображение
You can change your face, but can`t change your mind. No matter what you do.
Создайте еще более понятный интерфейс и мир создаст еще более тупого юзера. (с) Баш

ANDLL
Великий гастроном
Великий гастроном
Аватара пользователя
 
Сообщения: 3450
Зарегистрирован: 29.06.2003 (Вс) 18:55

Re: Моя тупость vs Image

Сообщение ANDLL » 05.01.2009 (Пн) 19:23

Уж не знаю что ты подразумевал вторым, но MarshalByRefObject тут не причем
Гастрономия - наука о пище, о ее приготовлении, употреблении, переварении и испражнении.
Блог

MIT
Мега гуру
Мега гуру
Аватара пользователя
 
Сообщения: 2211
Зарегистрирован: 17.09.2006 (Вс) 22:46

Re: Моя тупость vs Image

Сообщение MIT » 05.01.2009 (Пн) 19:28

Я подразумевал следующее: просто передать в процедуру Image при помощи ByVal, при этом будет передан не сам объект, а ссылка на него (это, вроде, следствие наследования MarshalByRefObject`а)
Изображение
You can change your face, but can`t change your mind. No matter what you do.
Создайте еще более понятный интерфейс и мир создаст еще более тупого юзера. (с) Баш

ANDLL
Великий гастроном
Великий гастроном
Аватара пользователя
 
Сообщения: 3450
Зарегистрирован: 29.06.2003 (Вс) 18:55

Re: Моя тупость vs Image

Сообщение ANDLL » 05.01.2009 (Пн) 19:53

Передастся ссылка, но это не следствие того самого
Гастрономия - наука о пище, о ее приготовлении, употреблении, переварении и испражнении.
Блог

MIT
Мега гуру
Мега гуру
Аватара пользователя
 
Сообщения: 2211
Зарегистрирован: 17.09.2006 (Вс) 22:46

Re: Моя тупость vs Image

Сообщение MIT » 10.01.2009 (Сб) 13:28

А можно как-нибудь узнать о факте изменения Image`а?
Изображение
You can change your face, but can`t change your mind. No matter what you do.
Создайте еще более понятный интерфейс и мир создаст еще более тупого юзера. (с) Баш

ANDLL
Великий гастроном
Великий гастроном
Аватара пользователя
 
Сообщения: 3450
Зарегистрирован: 29.06.2003 (Вс) 18:55

Re: Моя тупость vs Image

Сообщение ANDLL » 10.01.2009 (Сб) 13:55

Это как?
Гастрономия - наука о пище, о ее приготовлении, употреблении, переварении и испражнении.
Блог

MIT
Мега гуру
Мега гуру
Аватара пользователя
 
Сообщения: 2211
Зарегистрирован: 17.09.2006 (Вс) 22:46

Re: Моя тупость vs Image

Сообщение MIT » 10.01.2009 (Сб) 14:13

Ну например так: есть класс с глобальной переменной Img as Image, кто-то "извне" изменяет картинку (например пририсовывает какой-нибудь текст), а класс каки-то образом должен поймать событие изменения.
Единственная моя идея - сделать картинку как свойство и обрабатывать Set.
Изображение
You can change your face, but can`t change your mind. No matter what you do.
Создайте еще более понятный интерфейс и мир создаст еще более тупого юзера. (с) Баш

ANDLL
Великий гастроном
Великий гастроном
Аватара пользователя
 
Сообщения: 3450
Зарегистрирован: 29.06.2003 (Вс) 18:55

Re: Моя тупость vs Image

Сообщение ANDLL » 10.01.2009 (Сб) 15:08

Чето нефига не понятно. Нужно отловить как Image изменяется, или как изменяется переменная as image?
Гастрономия - наука о пище, о ее приготовлении, употреблении, переварении и испражнении.
Блог

MIT
Мега гуру
Мега гуру
Аватара пользователя
 
Сообщения: 2211
Зарегистрирован: 17.09.2006 (Вс) 22:46

Re: Моя тупость vs Image

Сообщение MIT » 10.01.2009 (Сб) 15:11

Нужно отловить изменение Img
Изображение
You can change your face, but can`t change your mind. No matter what you do.
Создайте еще более понятный интерфейс и мир создаст еще более тупого юзера. (с) Баш

ANDLL
Великий гастроном
Великий гастроном
Аватара пользователя
 
Сообщения: 3450
Зарегистрирован: 29.06.2003 (Вс) 18:55

Re: Моя тупость vs Image

Сообщение ANDLL » 10.01.2009 (Сб) 15:47

:?
Гастрономия - наука о пище, о ее приготовлении, употреблении, переварении и испражнении.
Блог

MIT
Мега гуру
Мега гуру
Аватара пользователя
 
Сообщения: 2211
Зарегистрирован: 17.09.2006 (Вс) 22:46

Re: Моя тупость vs Image

Сообщение MIT » 10.01.2009 (Сб) 15:59

:D А по-подробнее чуть-чуть можно?

Хотя почему-то мне подумывается что это бредни и невозможно по определению...
Изображение
You can change your face, but can`t change your mind. No matter what you do.
Создайте еще более понятный интерфейс и мир создаст еще более тупого юзера. (с) Баш

ANDLL
Великий гастроном
Великий гастроном
Аватара пользователя
 
Сообщения: 3450
Зарегистрирован: 29.06.2003 (Вс) 18:55

Re: Моя тупость vs Image

Сообщение ANDLL » 10.01.2009 (Сб) 16:02

А можно лицезреть код, который нужно отхэндлить?
Гастрономия - наука о пище, о ее приготовлении, употреблении, переварении и испражнении.
Блог

MIT
Мега гуру
Мега гуру
Аватара пользователя
 
Сообщения: 2211
Зарегистрирован: 17.09.2006 (Вс) 22:46

Re: Моя тупость vs Image

Сообщение MIT » 10.01.2009 (Сб) 16:52

Собственно, примерчег:
Код: Выделить всё
Imports System.IO

Public Class Form1
    Private Const url As String = "http://bbs.vbstreets.ru/download/file.php?avatar=11295_1230764984.png"
    Private img As Image

    Private WithEvents a As New Async

    Private IsPicDownloaded As Boolean


    'вот как бы сюда нам и надо попасть после изменения img`а. Нужен не факт того, что AsyncWorker скачал, а то что кто-то изменил img
    Private Sub ImgChanged()
        IsPicDownloaded = True
        Me.Invalidate()
    End Sub


    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        a.DownLoadPic(url, img)
    End Sub


    Private Sub Form1_Paint(ByVal sender As Object, ByVal e As System.Windows.Forms.PaintEventArgs) Handles Me.Paint
        If IsPicDownloaded Then
            If Not img Is Nothing Then e.Graphics.DrawImageUnscaled(img, 10, 10)
        End If
    End Sub

End Class


Public Class Async
    Public Class AsyncWorker
        Implements IDisposable

        Private _myId As Integer, dl As String
        'TODO: А как объявить переменную, что бы переданный Image в Sub New можно было юзать и  изменять в других функциях?
        Dim _img As Image
        Dim WithEvents wc As New Net.WebClient
        Dim ms As MemoryStream
        Dim mw As BinaryWriter

        Public Event Complete(ByVal myId As Integer)
        Public Event PicDownloaded(ByVal Img As Byte(), ByVal id As Integer)

        Public Sub New(ByVal myId As Integer, ByVal img As Image, ByVal Url As Uri)
            Randomize()
            _myId = myId
            _img = img
            dl = Url.AbsoluteUri
            wc.DownloadDataAsync(Url)
        End Sub

        Public ReadOnly Property URL() As String
            Get
                Return dl
            End Get
        End Property

#Region " IDisposable Support "
        Private disposedValue As Boolean = False        ' To detect redundant calls

        ' IDisposable
        Protected Overridable Sub Dispose(ByVal disposing As Boolean)
            If Not Me.disposedValue Then
                If disposing Then
                    ' TODO: free other state (managed objects).
                    ' t.Dispose()
                    wc.Dispose()
                    mw = Nothing
                    ms.Dispose()
                End If

                ' TODO: free your own state (unmanaged objects).
                ' TODO: set large fields to null.
            End If
            Me.disposedValue = True
        End Sub
        ' This code added by Visual Basic to correctly implement the disposable pattern.
        Public Sub Dispose() Implements IDisposable.Dispose
            ' Do not change this code.  Put cleanup code in Dispose(ByVal disposing As Boolean) above.
            Dispose(True)
            GC.SuppressFinalize(Me)
        End Sub
#End Region

        Private Sub wc_DownloadDataCompleted(ByVal sender As Object, ByVal e As System.Net.DownloadDataCompletedEventArgs) Handles wc.DownloadDataCompleted
            If Not e.Cancelled Then
                ms = New MemoryStream : mw = New BinaryWriter(ms)
                Try
                    mw.Write(e.Result)
                    ms.Position = 0

                    _img = Image.FromStream(ms)
                    RaiseEvent PicDownloaded(e.Result, _myId)
                Catch ex As Exception

                End Try
            End If
            RaiseEvent Complete(_myId)
        End Sub
    End Class

    Private aw() As AsyncWorker
    Private _url As String
    Public Event PicDownloaded(ByVal Pic As Byte(), ByVal name As String)

    Public Sub DownLoadPic(ByVal URL As String, ByVal img As Image)
        Dim added As Boolean = False
        Dim i As Integer
        _url = URL
        Try
            For i = 0 To aw.Length - 1
                If IsNothing(aw(i)) Then
                    aw(i) = New AsyncWorker(i, img, New Uri(_url))

                    AddHandler aw(i).Complete, AddressOf DisposeWorker
                    AddHandler aw(i).PicDownloaded, AddressOf Pic1
                    added = True
                    Exit For
                End If
            Next
            If Not added Then
                ReDim Preserve aw(aw.Length)
                aw(aw.Length - 1) = New AsyncWorker(i, img, New Uri(_url))

                AddHandler aw(i).Complete, AddressOf DisposeWorker
                AddHandler aw(i).PicDownloaded, AddressOf Pic1
            End If
        Catch ex As UriFormatException
            MsgBox(ex.Message, MsgBoxStyle.Exclamation)
        End Try
    End Sub
    Private Sub DisposeWorker(ByVal Id As Integer)
        RemoveHandler aw(Id).Complete, AddressOf DisposeWorker
        RemoveHandler aw(Id).PicDownloaded, AddressOf Pic1
        aw(Id).Dispose()
        aw(Id) = Nothing
    End Sub
    Private Sub Pic1(ByVal arr As Byte(), ByVal Id As Integer)
        RaiseEvent PicDownloaded(arr, IO.Path.GetFileName(aw(Id).URL))
    End Sub

    Public Sub New()
        ReDim aw(-1)
    End Sub
End Class


Там 2 проблемы (обе закомментированы)
1ая: как таскать с собой постоянно один и тот же Image
2ая: как отловить изменение Image`а
Изображение
You can change your face, but can`t change your mind. No matter what you do.
Создайте еще более понятный интерфейс и мир создаст еще более тупого юзера. (с) Баш

MIT
Мега гуру
Мега гуру
Аватара пользователя
 
Сообщения: 2211
Зарегистрирован: 17.09.2006 (Вс) 22:46

Re: Моя тупость vs Image

Сообщение MIT » 11.01.2009 (Вс) 15:07

Конткретно эту поставленную задачу я решил с помощью использования делегатов и логически правильных событийно-следственных связей.
Но на оба вопроса я все еще хочу знать ответ.
Изображение
You can change your face, but can`t change your mind. No matter what you do.
Создайте еще более понятный интерфейс и мир создаст еще более тупого юзера. (с) Баш

ANDLL
Великий гастроном
Великий гастроном
Аватара пользователя
 
Сообщения: 3450
Зарегистрирован: 29.06.2003 (Вс) 18:55

Re: Моя тупость vs Image

Сообщение ANDLL » 11.01.2009 (Вс) 15:13

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


Вернуться в Visual Basic .NET

Кто сейчас на конференции

Сейчас этот форум просматривают: Yandex-бот и гости: 4

    TopList  
cron