অ্যান্ড্রয়েড: পিকাসো দিয়ে বিজ্ঞপ্তি চিত্র তৈরি করুন


108

প্রশ্নটি জিজ্ঞাসা করা হয়েছিল এবং পিকাসোর যে সংস্করণটি আমি ব্যবহার করছি তার জন্য খুব একটা প্রতিশ্রুতি দেওয়া হয়েছিল: আমি কীভাবে পিকাসো ব্যবহার করে কোনও চিত্রগ্রাহকে একটি বিজ্ঞপ্তি বিটম্যাপ পাঠাব? আমি পিকাসোতে নতুন এবং আমি কেবল ব্যবহার করেছি

Picasso.with(context).load(url).resize(w, h).into(imageview);

আমি ইতিমধ্যে https://gist.github.com/julianshen/5829333 খুঁজে পেয়েছি তবে কীভাবে এটিকে উপরেহীনের সাথে একত্রীকরনীয়ভাবে যুক্ত করতে হবে তা আমি নিশ্চিত নই।


আপনার দেওয়া লিঙ্কটি আপনার নিজের প্রশ্নের উত্তর দেওয়ার জন্য যথেষ্ট ছিল। এবং আপনার কেবল পিকাসো.ইথ (ক্রিয়াকলাপ)। লোড (মেয়রশিপআইম্যাজলিঙ্ক)। ট্রান্সফর্ম (নতুন সার্কেল ট্রান্সফর্ম ())। (ইমেজভিউ) এ প্রয়োগ করতে হবে;
লেগোস

উত্তর:


286

উত্তরগুলি উপলভ্য হওয়ার আগে কিছুটা গবেষণা করুন। যাইহোক, এই লিঙ্কটি অনুসরণ করুন এবং এটি কীভাবে ব্যবহার করতে হয় তা জানতে সাবধানে পড়ুন।

এটা চেষ্টা কর:

import com.squareup.picasso.Transformation;

public class CircleTransform implements Transformation {
    @Override
    public Bitmap transform(Bitmap source) {
        int size = Math.min(source.getWidth(), source.getHeight());

        int x = (source.getWidth() - size) / 2;
        int y = (source.getHeight() - size) / 2;

        Bitmap squaredBitmap = Bitmap.createBitmap(source, x, y, size, size);
        if (squaredBitmap != source) {
            source.recycle();
        }

        Bitmap bitmap = Bitmap.createBitmap(size, size, source.getConfig());

        Canvas canvas = new Canvas(bitmap);
        Paint paint = new Paint();
        BitmapShader shader = new BitmapShader(squaredBitmap,
                Shader.TileMode.CLAMP, Shader.TileMode.CLAMP);
        paint.setShader(shader);
        paint.setAntiAlias(true);

        float r = size / 2f;
        canvas.drawCircle(r, r, r, paint);

        squaredBitmap.recycle();
        return bitmap;
    }

    @Override
    public String key() {
        return "circle";
    }
}

তাহলে কেবল এটির মতো প্রয়োগ করুন:

Picasso.with(activity).load(mayorShipImageLink).transform(new CircleTransform()).into(ImageView);

@ অনিরুধ-শর্মা এই আমদানিগুলি যুক্ত করার বিষয়টি নিশ্চিত করুন: অ্যান্ড্রয়েড.গ্রাফিক্স আমদানি করুন: বিটম্যাপ; আমদানি অ্যান্ড্রয়েড.গ্রাফিক্স.বিটম্যাপ শেডার; অ্যান্ড্রয়েড.গ্রাফিক্স.ক্যানভাস আমদানি করুন; আমদানি android.ographicics.Paint; আমদানি com.squareup.picasso. ট্রান্সফর্মেশন;
এজি 1

1
@ সমস্ত: আপনি জিআইএফ চিত্রগুলিতে নাল পয়েন্টার ব্যতিক্রম হলে, এটি দেখুন
সারলিন

কোটলিনেও কবজির মতো কাজ করে। বিদ্যমান এপিআইগুলির জন্য একটি পরিবর্তন, BitmapShader.TileMode.CLAMPআর অস্তিত্ব নেই, আমি উত্তরটি আপডেট করেছি
Sud007

কাজ করে না! সম্ভাব্য মারাত্মক সংকেত 6 (সিগবার্ট) এর অর্থ, বিটম্যাপ.সাইকেল () আসলে মেমরি থেকে রিফ্রেন্সকে সরিয়ে দিচ্ছে এবং একটি signal 6 (SIGABRT), code -6 (SI_TKILL), fault addr -------- 11-12 00:03:47.941 29091 29091 F DEBUG : Abort message: 'Error, cannot access an invalid/free'd bitmap here!'-> বার্তা বাতিল করুন: 'ত্রুটি, এখানে একটি অবৈধ / মুক্ত' বিটম্যাপ অ্যাক্সেস করতে পারে না! কারণ এটি আবর্জনা স্মৃতি থেকে দূরে সংগ্রহ করা হয়। bitmap.recycleপুরানো অ্যান্ড্রয়েড ডিভাইসগুলির জন্য ব্যবহৃত হয়, এটি আমি বুঝতে পারি।
হারুন হাজেম

47

এখানে সমর্থন-ভি 4 লাইব্রেরি দ্বারা সরবরাহিত কিছু আছে ! রাউন্ডডবিটম্যাপড্রেবলের দিকে নজর দিন । আপনার নিজস্ব রোল করার দরকার নেই:

Picasso.with(context).load(url)
                        .resize(w, h)
                        .into(myImageView, new Callback() {
                            @Override
                            public void onSuccess() {
                                Bitmap imageBitmap = ((BitmapDrawable) myImageView.getDrawable()).getBitmap();
                                RoundedBitmapDrawable imageDrawable = RoundedBitmapDrawableFactory.create(getResources(), imageBitmap);
                                imageDrawable.setCircular(true);
                                imageDrawable.setCornerRadius(Math.max(imageBitmap.getWidth(), imageBitmap.getHeight()) / 2.0f);
                                myImageView.setImageDrawable(imageDrawable);
                            }
                            @Override
                            public void onError() {
                                myImageView.setImageResource(R.drawable.default_image);
                            }
                        });

দ্রষ্টব্য: পিকাসোর একটি। ট্রান্সফর্ম (কাস্টম ট্রান্সফর্মেশন) কল রয়েছে যা আপনি তাত্ত্বিকভাবে ব্যবহার করতে পারেন, তবে আমার তাতে সমস্যা ছিল। এটি উপরের কাজ করে। শুভকামনা!


এটি স্কোয়ার ইমেজের জন্য পুরোপুরি কাজ করবে। কোনও চিত্রের জন্য কোণার ব্যাসার্ধে ম্যাথ.মিন ব্যবহার করুন। imageDrawable.setCornerRadius (ম্যাথ.মিনি (ইমেজবিটম্যাপ.সেটভিডথ (), ইমেজবিটম্যাপ.জিটহাইট ()) / 2.0f);
এক্সপ্লোসিভ

আমরা অনসুকেসিতে আলাদা থ্রেড তৈরি করা উচিত না, কারণ উত্স বিটম্যাপ থেকে গোলাকার বিটম্যাপ তৈরি করা দীর্ঘ কাজ হতে পারে?
হাসাদেব

17

আমি খুঁজে পেলাম অন্য বিকল্পটি হ'ল এই ছেলেদের পাঠাগার। এটি স্বতন্ত্র কাজ করে বা পিকাসোর সাথে একত্রে কাজ করে। আমি নীচের মতো পিকাসো রুটটি বেছে নিয়েছি:

https://github.com/vinc3m1/RoundedImageView

Transformation transformation = new RoundedTransformationBuilder()
          .borderColor(Color.BLACK)
          .borderWidthDp(3)
          .cornerRadiusDp(30)
          .oval(false)
          .build();

Picasso.with(context)
    .load(url)
    .fit()
    .transform(transformation)
    .into(imageView);

আমার জন্য কাজ!


12

পিকাসোর জন্য একটি রূপান্তর গ্রন্থাগার রয়েছে।

কেবল গ্রেড নির্ভরতা যুক্ত করুন

implementation 'jp.wasabeef:picasso-transformations:2.2.1'

এটি শেষ করুন

Picasso.with(context)
       .load(url)
       .resize(w, h)
       .transform(new CropCircleTransformation())
       .into(imageview);

উইকি: পিকাসো রূপান্তরকরণ


এটি সত্যিই এই প্রশ্নের সঠিক উত্তর, এটি কীভাবে খুব কম ভোট পেয়েছে ..
ডিডিসিপল

10

আমি উপরের সমস্ত সমাধান চেষ্টা করে দেখেছি তবে সেগুলির মধ্যে কেউই আমাকে ফসলের চিত্র ছাড়াই বৃত্তে রূপান্তর দেয় না..এই সমাধানটি একই প্রস্থ এবং উচ্চতার চিত্রগুলির জন্য কাজ করবে..এটি আমার উপরের সমাধান

প্রথম ------

Picasso.with(getActivity())
            .load(url)
            .error(R.drawable.image2)
            .placeholder(R.drawable.ic_drawer)
            .resize(200, 200)
            .transform(new ImageTrans_CircleTransform())
            .into(imageView1);

তাহলে এটি করুন --------

import android.graphics.Bitmap;
import android.graphics.BitmapShader;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.Shader.TileMode;

import com.squareup.picasso.Transformation;
public class ImageTrans_CircleTransform implements Transformation {
 @Override
    public Bitmap transform(Bitmap source) {
 if (source == null || source.isRecycled()) {
                return null;
            }

            final int width = source.getWidth() + borderwidth;
            final int height = source.getHeight() + borderwidth;

            Bitmap canvasBitmap = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888);
            BitmapShader shader = new BitmapShader(source, TileMode.CLAMP, TileMode.CLAMP);
            Paint paint = new Paint();
            paint.setAntiAlias(true);
            paint.setShader(shader);

            Canvas canvas = new Canvas(canvasBitmap);
            float radius = width > height ? ((float) height) / 2f : ((float) width) / 2f;
            canvas.drawCircle(width / 2, height / 2, radius, paint);

            //border code
            paint.setShader(null);
            paint.setStyle(Paint.Style.STROKE);
            paint.setColor(bordercolor);
            paint.setStrokeWidth(borderwidth);
            canvas.drawCircle(width / 2, height / 2, radius - borderwidth / 2, paint);
            //--------------------------------------

            if (canvasBitmap != source) {
                source.recycle();
            }

            return canvasBitmap;
}
 @Override
    public String key() {
        return "circle";
    }
}

8

একটি বিজ্ঞপ্তি চিত্রদর্শন তৈরি করতে এই লাইব্রেরিটি ব্যবহার করুন। একটি বৃত্তাকার ইমেজভিউ তৈরি করতে, আপনার প্রকল্পে এই সার্কুলার ইমেজভিউ লাইব্রেরি যুক্ত করুন এবং আপনার লেআউটটিতে সার্কুলার আইমেজভিউ যুক্ত করুন এক্সএমএল

<com.pkmmte.view.CircularImageView
        android:layout_width="250dp"
        android:layout_height="250dp"
        android:src="@drawable/image"
        app:border_color="#EEEEEE"
        app:border_width="4dp"
        app:shadow="true" />`

তারপরে এই চিত্রভিউতে প্রয়োজনীয় চিত্র লোড করতে পিকাসো ব্যবহার করুন। পিকাসো আপনার যে সমস্ত ক্যাচিংয়ের বিষয়ে উদ্বিগ্ন হওয়ার দরকার নেই তা করেন


2

নীচের কোড সহ ধরণের লেয়ার-তালিকার এক্সএমএল অঙ্কনযোগ্য অন্তর্ভুক্ত করুন

<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:id="@+id/shape_status">
        <shape android:shape="oval">
            <solid android:color="@android:color/black"/>
        </shape>
    </item>
<item android:drawable="@drawable/ic_status_content"/></layer-list>

তারপরে android.src- এ আপনার ইমেজভিউতে এক্সএমএল ব্যবহার করুন

 <ImageView
            android:id="@+id/iconStatus"
            android:layout_width="55dp"
            android:layout_height="55dp"
            android:layout_gravity="right"
            android:src="@drawable/ic_circle_status"
            android:layout_alignParentTop="true"
            android:layout_alignParentEnd="true"/>


0

এটি বর্তমান পিকাসো 3 স্ন্যাপশটের সাথে কাজ করছে:

class CircleTransformation : Transformation {

  override fun transform(source: RequestHandler.Result): RequestHandler.Result {
    if (source.bitmap == null) {
      return source
    }

    var bitmap: Bitmap

    // since we cant transform hardware bitmaps create a software copy first
    if (VERSION.SDK_INT >= VERSION_CODES.O && source.bitmap!!.config == Config.HARDWARE) {
      val softwareCopy = source.bitmap!!.copy(Config.ARGB_8888, true)
      if (softwareCopy == null) {
        return source
      } else {
        bitmap = softwareCopy
        source.bitmap!!.recycle()
      }
    } else {
      bitmap = source.bitmap!!
    }

    var size = bitmap.width
    // if bitmap is non-square first create square one
    if (size != bitmap.height) {
      var sizeX = size
      var sizeY = bitmap.height
      size = Math.min(sizeY, sizeX)
      sizeX = (sizeX - size) / 2
      sizeY = (sizeY - size) / 2

      val squareSource = Bitmap.createBitmap(bitmap, sizeX, sizeY, size, size)
      bitmap.recycle()
      bitmap = squareSource
    }

    val circleBitmap = Bitmap.createBitmap(size, size, Config.ARGB_8888)
    val canvas = Canvas(circleBitmap)
    val paint = Paint()
    val shader = BitmapShader(bitmap, Shader.TileMode.CLAMP, Shader.TileMode.CLAMP)

    paint.shader = shader
    paint.isAntiAlias = true
    val centerAndRadius = size / 2f
    canvas.drawCircle(centerAndRadius, centerAndRadius, centerAndRadius, paint)

    bitmap.recycle()
    return RequestHandler.Result(circleBitmap, source.loadedFrom, source.exifRotation)
  }

  override fun key(): String {
    return "circleTransformation()"
  }
}

পিকাসো 3 গিস্ট: https://gist.github.com/G00fY2/f3fbc468570024930c1fd9eb4cec85a1


0

পিকাসো v2.71828 এর সাথে আমার পক্ষে কী কাজ করেছে তা এখানে

class CircleTransform : Transformation {
override fun transform(source: Bitmap?): Bitmap? {
    if (source == null) {
        return source
    }

    var bitmap: Bitmap

    // since we cant transform hardware bitmaps create a software copy first
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O && source.config == Bitmap.Config.HARDWARE) {
        val softwareCopy = source.copy(Bitmap.Config.ARGB_8888, true)
        if (softwareCopy == null) {
            return source
        } else {
            bitmap = softwareCopy
            source.recycle()
        }
    } else {
        bitmap = source
    }

    var size = bitmap.width
    // if bitmap is non-square first create square one
    if (size != bitmap.height) {
        var sizeX = size
        var sizeY = bitmap.height
        size = Math.min(sizeY, sizeX)
        sizeX = (sizeX - size) / 2
        sizeY = (sizeY - size) / 2

        val squareSource = Bitmap.createBitmap(bitmap, sizeX, sizeY, size, size)
        bitmap.recycle()
        bitmap = squareSource
    }

    val circleBitmap = Bitmap.createBitmap(size, size, Bitmap.Config.ARGB_8888)
    val canvas = Canvas(circleBitmap)
    val paint = Paint()
    val shader = BitmapShader(bitmap, Shader.TileMode.CLAMP, Shader.TileMode.CLAMP)

    paint.shader = shader
    paint.isAntiAlias = true
    val centerAndRadius = size / 2f
    canvas.drawCircle(centerAndRadius, centerAndRadius, centerAndRadius, paint)

    bitmap.recycle()
    return circleBitmap
}


override fun key(): String {
    return "circleTransformation()"
}

}

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.